【leetcode】105.从前序和中序遍历序列构造二叉树(详细图解,java实现)

该博客详细介绍了如何根据前序和中序遍历序列构造二叉树,重点讲解了分治法的思想,并提供了一种Java实现。通过分析示例和画图,解释了如何找到根节点并递归构造左右子树。文中还提到了解题后的拓展,可以结合题目106来进一步巩固知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

105. 从前序与中序遍历序列构造二叉树

难度中等597收藏分享切换为英文关注反馈

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

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

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

分析

二叉树相关的很多问题的解决思路都有分治法的思想在里面。我们复习一下分治法的思想:把原问题拆解成若干个与原问题结构相同但规模更小的子问题,待子问题解决以后,原问题就得以解决,“归并排序”和“快速排序”都是分治法思想的应用,其中“归并排序”先无脑地“分”,在“合”的时候就麻烦一些;“快速排序”开始在 partition 上花了很多时间,即在“分”上使了很多劲,然后就递归处理下去就好了,没有在“合”上再花时间。

抓住“前序遍历的第 1 个元素一定是二叉树的根结点”,不难写出代码。关键还是拿 LeetCode 上面的例子画一个图,思路就很清晰了。

前序遍历数组的第 1 个数(索引为 0)的数一定是二叉树的根结点,于是可以在中序遍历中找这个根结点的索引,然后把“前序遍历数组”和“中序遍历数组”分为两个部分,就分别对应二叉树的左子树和右子树,分别递归完成就可以了。

105-1.png

下面是一个具体的例子,演示了如何计算数组子区间的边界:

image.png

这道题完成了以后可以顺便把 「力扣」 第 106 题:从中序与后序遍历序列构造二叉树也一起做了。

参考代码 1

  • Java
class TreeNode {
   
   
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
   
   
        val = x;
    }
}

public class Solution {
   
   

    public TreeNode buildTree(int[] preorder, int[] inorder) {
   
   
        int preLen = preorder.length;
        int inLen = inorder.length;
        if (preLen != inLen) {
   
   
            throw new RuntimeException("Incorr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值