414,剑指 Offer-重建二叉树

想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。也可以扫描下面的二维码关注
在这里插入图片描述

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


例如,给出

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

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


返回如下的二叉树:

在这里插入图片描述

限制:

  • 0 <= 节点个数 <= 5000

问题分析

这题和之前讲过的一道题重复了,399,从前序与中序遍历序列构造二叉树,这两道题其实是完全一样的,除了之前讲过的3种方法以外,我们今天再来讲一种解法,这种思想来源于403,验证二叉搜索树的第一种解法。前序遍历的第一个元素肯定是根节点,那么前序遍历的第一个节点在中序位置之前的都是根节点的左子节点,之后的都是根节点的右子节点,我们来简单画个图看一下
在这里插入图片描述

这里是随便举个例子,我们看到前序遍历的3肯定是根节点,那么在中序遍历中,3前面的都是3左子节点的值,3后面的都是3右子节点的值,

他真正的结构是这样的

在这里插入图片描述

我们来看下代码

private int in = 0;
private int pre = 0;

public TreeNode buildTree(int[] preorder, int[] inorder) {
    return build(preorder, inorder, Integer.MIN_VALUE);
}

private TreeNode build(int[] preorder, int[] inorder, int stop) {
    if (pre >= preorder.length)
        return null;
    if (inorder[in] == stop) {
        in++;
        return null;
    }

    TreeNode node = new TreeNode(preorder[pre++]);
    node.left = build(preorder, inorder, node.val);
    node.right = build(preorder, inorder, stop);
    return node;
}


总结

关于二叉树的算法题其实有很多,这里讲的也只是冰山一角,搞懂了上面和前面的几个关于二叉树的题,对二叉树算法相关题的理解也会进一步加深


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据结构和算法

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

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

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

打赏作者

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

抵扣说明:

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

余额充值