剑指 Offer -- 重建二叉树(四)

重建二叉树(四)

题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值