《编程之美》第3.9节:重建二叉树
问题:已知二叉树的先序和中序遍历,重构二叉树
解法:通过先序遍历,不断抽取子树的根节点进行重构。
代码:
#include<iostream>
using namespace std;
struct Node
{
Node *left;
Node *right;
char value;
Node(char v,Node *l=nullptr,Node *r=nullptr):value(v),left(l),right(r){}
};
int i=0;
Node *rebuildTree(char *pPreOrder,char *pInOrder,int nTreeLen)
{
if(nTreeLen<=0)//这一句判断不能少!!!因为每次都相当于把pPreOrder长度缩短了,
//但是相应的pInOrder长度并非和pPreOrder长度相同,是通过nTreeLen使两者强制相等的,因此一定要保证nTreeLen>0
//如果nTreeLen<=0,说明此时递归应该结束了
return nullptr;
Node *root=new Node(*pPreOrder);
cout<<++i<<endl;
if(nTreeLen==1)
return root;
char first=*pPreOrder;
int i=0;
while(pInOrder[i]!=first)
i++;
root->left=rebuildTree(pPreOrder+1,pInOrder,i);
root->right=rebuildTree(pPreOrder+i+1,pInOrder+i+1,nTreeLen-i-1);
return root;
}
int main()
{
char *pPreOrder="abdcef";
char *pInOrder="dbaecf";
Node *result=rebuildTree(pPreOrder,pInOrder,6);
system("pause");
return 0;
}
一定要注意nTreeLen<=0的情况,要直接返回!!