题目描述
输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。
注意:
二叉树中每个节点的值都互不相同;
输入的前序遍历和中序遍历一定合法;
样例
给定:
前序遍历是:[3, 9, 20, 15, 7]
中序遍历是:[9, 3, 15, 20, 7]
返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]
思路
先序遍历数组中的第一个数为根节点的值,然后从中序遍历的数组中找到这个值所在位置,则左边的数就是左子树的元素,右边的数就是右子树的元素,分别递归得到左子树和右子树。
class Solution {
public:
TreeNode* buildTree(vector<int> pre, vector<int> in) {
if(pre.size() == 0 || pre.size() != in.size()){
return nullptr;
}
int value = pre[0];
TreeNode* root = new TreeNode(value);
if(pre.size() == 1){
return root;
}
//在中序遍历中找出根节点所在位置
auto pos = find(in.begin(), in.end(), value);
//如果没找到,则返回NULL
if(pos == in.end()){
return nullptr;
}
int leftSize = pos - in.begin();
int rightSize = in.end() - pos - 1;
root->left = buildTree(vector<int>(pre.begin() + 1, pre.begin() + 1 + leftSize),
vector<int>(in.begin(), in.begin() + leftSize));
root->right = buildTree(vector<int>(pre.begin() + 1 + leftSize, pre.end()),
vector<int>(in.begin() + leftSize + 1, in.end()));
return root;
}
};