重建二叉树(四)
题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8}
和中序遍历序列 {4,7,2,1,5,3,8,6}
,则重建二叉树并返回。
代码(已在牛客上 AC)
使用递归来做非常简单, 首先注意到前序遍历的第一个节点是根节点, 然后在中序遍历中查找根节点的值, 在中序遍历中根节点左边的节点属于左子树, 右边的节点属于右子树, 通过计算左右子树的个数, 去前序遍历中确定左右子树前序遍历的结果. 这样的话, 左右子树的前序和中序遍历的范围都确定了, 此时就可以用递归来求解.
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
return constructBT(pre, 0, pre.size() - 1, vin, 0, vin.size() - 1);
}
private:
TreeNode* constructBT(vector<int> &pre, int pi, int pj, vector<int> &vin, int vi, int vj) {
if (pi > pj || vi > vj) return nullptr;
TreeNode *root = new TreeNode(pre[pi]);
int idx = 0;
for (int i = vi; i <= vj; ++i)
if (vin[i] == pre[pi]) {
idx = i;
break;
}
int size = idx - vi;
root->left = constructBT(pre, pi + 1, pi + size, vin, vi, idx - 1);
root->right = constructBT(pre, pi + size + 1, pj, vin, idx + 1, vj);
return root;
}
};