1.题目
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
2.code
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
int prelen=pre.size();
int vinlen=vin.size();
if(prelen==0||vinlen==0)
return NULL;
else
return Construct(pre,0,prelen-1,vin,0,vinlen-1);
}
TreeNode* Construct(vector<int>pre,int prestart,int preend,vector<int>vin,int vinstart,int vinend)
{
//判断只有一个节点的情况
TreeNode* root=new TreeNode(NULL);
root->val=pre[prestart];
if(prestart==preend)
{
if(vinstart==vinend&&pre[prestart]==vin[vinstart])
return root;
}
//在中序序列中找对应的值
int rootval=pre[prestart];
int rootpos=vinstart;
while(vin[rootpos]!=rootval&&rootpos<=vinend)
rootpos++;
//while(rootpos>vinend) 如何表示错误信息
//找到根节点
int leftsize=rootpos-vinstart;
//左子树存在
if(leftsize>0)
root->left=Construct(pre,prestart+1,prestart+leftsize,vin,vinstart,rootpos-1);
//右子树存在:前序序列长度大于左子树大小,那么就说明有右子树
if(leftsize<(preend-prestart))
root->right=Construct(pre,prestart+leftsize+1,preend,vin,rootpos+1,vinend);
return root;
}
};
3.分析
注意边界情况:递归终止的条件;记得明确,当pre和vin都只剩下一个元素的时候。