您的位置:首页 > 其它

已知中序和先序,求二叉树的重构问题

2011-05-23 15:58 225 查看
 

http://www.cnblogs.com/DiaoCow/archive/2010/04/17/1714273.html

 

这里用二重指针的问题困扰了我好久,不然只用一重指针出不来结果或者执行不下去。因为显示时调用了PostOrder函数,所以必须先生成一个二叉链表(PostOrder函数对此二叉链表的根操作),而输入只是两行字符串,所以还要生成二叉链表!!可能这就是用二重指针的原因。程序如下,已经过多种情况的测试:

 

 

#include<iostream.h>
#include<string.h>

 

struct NODE{
 NODE *pLeft;
 NODE *pRight;
 char chValue;
};

 

 

 

void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE **pRoot) 

{
 NODE *pTemp=new NODE;
 pTemp->chValue=*pPreOrder;
 pTemp->pLeft=pTemp->pRight=NULL;
 *pRoot=pTemp;

 if(nTreeLen==1) return;    //边界条件,递归出口条件就是它

 char* pLeftEnd=pInOrder;
 int nLeftLen,nRightLen;

 while(*pPreOrder!=*pLeftEnd)     
  pLeftEnd++;
 nLeftLen=pLeftEnd-pInOrder;     //划分左右子树
 nRightLen=nTreeLen-nLeftLen-1;
 if(nLeftLen>0)
  Rebuild(pPreOrder+1,pInOrder,nLeftLen,&(pTemp->pLeft));   //递归求解左子树
 if(nRightLen>0)
  Rebuild(pPreOrder+nLeftLen+1,pInOrder+nLeftLen+1,nRightLen,&(pTemp->pRight));    //递归求解右子树
}

 

 

 

void PostOrder(NODE *p)     //后序遍历
{
 if(p)
 {
  PostOrder(p->pLeft);
  PostOrder(p->pRight);
  cout<<p->chValue<<” “;
 }
}

 

 

void main()
{
 char* szPreOrder=”abcdefg”;
 char* szInOrder=”dcbaefg”;
 NODE *Root=NULL;
 Rebuild(szPreOrder,szInOrder,strlen(szPreOrder),&Root);
 PostOrder(Root);
}

 

 

 

 

 

 

或者用指针的引用,而不用二重指针可以如下

 

#include<iostream.h>
#include<string.h>

 

struct NODE{
 NODE *pLeft;
 NODE *pRight;
 char chValue;
};

 

 

void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE *&pRoot)  //用指针的引用,则只用单重指针
{
 NODE *pTemp=new NODE;
 pTemp->chValue=*pPreOrder;
 pTemp->pLeft=pTemp->pRight=NULL;
 pRoot=pTemp;

 if(nTreeLen==1) return;    //边界条件,递归出口条件就是它

 char* pLeftEnd=pInOrder;
 int nLeftLen,nRightLen;

 while(*pPreOrder!=*pLeftEnd)     
  pLeftEnd++;
 nLeftLen=pLeftEnd-pInOrder;     //划分左右子树
 nRightLen=nTreeLen-nLeftLen-1;
 if(nLeftLen>0)
  Rebuild(pPreOrder+1,pInOrder,nLeftLen,pRoot->pLeft);   //递归求解左子树
 if(nRightLen>0)
  Rebuild(pPreOrder+nLeftLen+1,pInOrder+nLeftLen+1,nRightLen,pRoot->pRight);    //递归求解右子树
}

 

 

 

void PostOrder(NODE *p)     //后序遍历
{
 if(p)
 {
  PostOrder(p->pLeft);
  PostOrder(p->pRight);
  cout<<p->chValue<<” “;
 }
}

 

 

 

void main()
{
 char* szPreOrder=”abcdefg”;
 char* szInOrder=”dcbaefg”;
 NODE *Root=NULL;
 Rebuild(szPreOrder,szInOrder,strlen(szPreOrder),Root);
 PostOrder(Root);
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  null 测试 2010