问题:给定二叉树的先序遍历和中序遍历字符串结果,重建二叉树。
思路:假设先序遍历和后续遍历结果为A和B,利用A[0]在B中的位置pCut可以将A和B分别划分成三个部分,B中pCut左侧将构成二叉树的左子树,pCut右侧的将构成右子树。
代码:
#include <iostream>
#include <iomanip>
using namespace std;
typedef struct BTNode
{
char data;
BTNode * lChild,*rChild;
} BTNode,*BTree;
void Rebuild(char *pPreSeq,char *pInSeq,int TreeLen, BTree *pRoot)
{
if(pPreSeq == NULL || pInSeq == NULL)
return;
/* Create New Node*/
BTNode * pNode = new BTNode;
pNode->data = *pPreSeq;
pNode->lChild = pNode->rChild = NULL;
if(*pRoot == NULL)
*pRoot = pNode;
if(TreeLen == 1)
return;
/* left and right Bin Tree cut*/
char *pCut = pInSeq;
int tmpLen = 0;
while(*pCut != *pPreSeq)
{
if(pCut == NULL || pPreSeq == NULL)
return;
tmpLen++;
if(tmpLen > TreeLen)
break;
pCut++;
}
int nLeftLen = 0;
nLeftLen = (int)(pCut - pInSeq);
int nRightLen = 0;
nRightLen = TreeLen - nLeftLen - 1;
/* recursively rebuild the left and right child */
if(nLeftLen)
Rebuild(pPreSeq+1,pInSeq,nLeftLen,&((*pRoot)->lChild));
if(nRightLen)
Rebuild(pPreSeq+nLeftLen+1,pInSeq+nLeftLen+1,nRightLen,&((*pRoot)->rChild));
}
void PostOrderTraverse(BTree T)
{
if(T){
PostOrderTraverse(T->lChild);
PostOrderTraverse(T->rChild);
cout<<setw(3)<<left<<T->data;
}
}
void ClearBTree(BTree *T)
{
if(*T)
{
ClearBTree(&((*T)->lChild));
ClearBTree(&((*T)->rChild));
delete (*T);
*T = NULL;
}
}
int main()
{
char cPre[6] = {'a','b','d','c','e','f'};
char cIn[6] = {'d','b','a','e','c','f'};
BTree T = NULL;
Rebuild(cPre,cIn,6,&T);
PostOrderTraverse(T);
ClearBTree(&T);
}
输出:
d b e f c a
REF:
1,编程之美 3.9