题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:
根据前序在中序中找到根节点,然后递归对左右子树创建。
代码:
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) {
TreeNode* tree = ReConstructBinaryTree(pre, 0, pre.size()-1, vin, 0, vin.size()-1);
return tree;
}
TreeNode* ReConstructBinaryTree(vector<int> pre, int preStart, int preEnd, vector<int> vin, int vinStart, int vinEnd){
if (preStart > preEnd || vinStart > vinEnd)
return NULL;
int root_id;
for (int i=vinStart; i<=vinEnd; ++i) {
if (vin[i] == pre[preStart]) {
root_id = i;
break;
}
}
TreeNode* Node = new TreeNode(pre[preStart]);
Node->left = ReConstructBinaryTree(pre, preStart+1, preStart+root_id-vinStart, vin, vinStart, root_id-1);
Node->right = ReConstructBinaryTree(pre, preStart+1+root_id-vinStart, preEnd, vin, root_id+1, vinEnd);
return Node;
}
};