题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
算法:
前序遍历的第一个点是树的根节点,然后在中序遍历中找到此根节点,分为2部分,左边为左子树,右边为右子树。
class Solution {
public:
struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {
if(pre.size()==0 || in.size()==0)
return NULL;
TreeNode *root = new TreeNode(-1);
helper(pre,in,root);
return root;
}
void helper(vector<int>pre,vector<int>in,TreeNode*root){
int key = pre[0];
root->val = key;
vector<int>left_pre;
vector<int>left_in;
vector<int>right_pre;
vector<int>right_in;
for (int i = 0; i < in.size(); i++)
{
if(in[i] == key){
left_pre.push_back(pre[i]);
for(int k = i+1;k<in.size();k++){
right_pre.push_back(pre[k]);
right_in.push_back(in[k]);
}
break;
}
else{
if(i!=0)
left_pre.push_back(pre[i]);
left_in.push_back(in[i]);
}
}
if(left_in.size()>0){
TreeNode* new_left = new TreeNode(-1);
root->left = new_left;
helper(left_pre,left_in,new_left);
}
if(right_in.size()>0){
TreeNode* new_right = new TreeNode(-1);
root->right = new_right;
helper(right_pre,right_in,new_right);
}
}
};