64.树 | 重建二叉树

该文章介绍了一种方法,通过先序遍历和中序遍历的起始和结束下标,使用递归来构建二叉树。关键在于利用哈希映射存储中序遍历中每个值的下标,以快速找到中间节点,然后分别构造左右子树。这种方法优化了查找过程,提高了效率。
摘要由CSDN通过智能技术生成

        之前做过,参考16.树(5)中的最后一道题,用递归方式,将先序遍历的起始、结束下标,和中序遍历的起始、结束下标作为参数,在每个递归函数中先找到当前节点,即先序遍历的第一个节点,也就是中序遍历的某个中间节点,依据此节点将中序遍历一分为二,左边部分为当前节点的左子节点,右边部分为当前节点的右子节点,如此递归。

        递归过程中要找到中间节点,如果每层递归中都用for循环来查找确定的话比较耗时,可以在一开始就用map保存每个val在inorder中的下标。

class Solution {
public:
    unordered_map<int, int> indexs;
    TreeNode* build(vector<int>& preorder, int beginPre, int endPre, vector<int>& inorder, int beginIn, int endIn) {
        if (beginPre > endPre) {
            return nullptr;
        }
        TreeNode* node = new TreeNode(preorder[beginPre]);
        int mid = indexs[preorder[beginPre]];
        int lenLeft = mid - beginIn, lenRight = endIn - mid;
        node->left = build(preorder, beginPre + 1, beginPre + lenLeft, inorder, beginIn, beginIn + lenLeft - 1);
        node->right = build(preorder, beginPre + lenLeft + 1, endPre, inorder, mid + 1, endIn);
        return node;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = preorder.size();
        for (int i = 0; i < n; ++i) {
            indexs[inorder[i]] = i; 
        }
        return build(preorder, 0, n - 1, inorder, 0, n - 1);
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值