剑指 Offer 07. 重建二叉树

剑指 Offer 07. 重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

样例

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

解决思路

O ( n ) O(n) O(n)

这道题目关键思路在于利用preorderinorder将每次分治需要构建子树的节点划分开

因此正确确定划分的下标是解题关键;

  • 每次子树的根节点一定是inorder的第一个
  • 利用inorder中找到的根节点确定左右子树节点的数目,并去preorder中进行划分
  • 代码中的pl, pr, il, ir 分别代表以当前构建节点为根,分别构建的左右子树在preorderinorder中的其实和终止下标(是闭区间)

关于更加详细的解释可以参考AcWing中的讲解

C++ 代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:

    map<int, int> hash;

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        for (int i = 0; i < inorder.size(); i ++ ) hash[inorder[i]] = i;
        return build(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
    }

    TreeNode* build(vector<int>& preorder, vector<int>& inorder, int pl, int pr, int il, int ir) {
        if (il > ir) return nullptr;
        auto node = new TreeNode(preorder[pl]);
        int k = hash[node->val];
        node->left = build(preorder, inorder, pl + 1, pl + k - il, il, k - 1); // 关键点
        node->right = build(preorder, inorder, pl + k - il + 1, pr, k + 1, ir); // 关键点
        return node;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水能zai舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值