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);
}