Description
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
Solution:
两个遍历序列的特点:
- 前序遍历:root,左子树,右子树
- 中序遍历:左子树,root,右子树
依此,我们可以先在前序中得到root,然后在中序中将左子树和右子树分开,从而得到在两个子树的前序遍历和中序遍历。最后递归得到整个二叉树。
//C++
TreeNode* reConstructBinaryTree(vector<int>& pre,vector<int>& vin) {
if(pre.empty() || vin.empty()) return NULL;
return helper(pre, vin, 0, pre.size(), 0, vin.size());
}
//ps: pre中的开始index
//pe: pre中的结束index
//is:vin中的开始index
//ie:vin中的结束index
//两个区间均为左闭右开
TreeNode* helper(const vector<int>& pre, const vector<int>& vin,
int ps, int pe, int is, int ie){
if(ps >= pe || is >= ie) return NULL;
TreeNode* root = new TreeNode(pre[ps]);
//search
for(int i = is; i < ie; ++i){
if(vin[i] == pre[ps]){
root->left = helper(pre, vin, ps+1, ps + i - is + 1, is, i);
root->right = helper(pre, vin, ps + i - is + 1, pe, i+1, ie);
break;
}
}
return root;
}