首页 > 其他分享 >图解LeetCode——剑指 Offer 07. 重建二叉树

图解LeetCode——剑指 Offer 07. 重建二叉树

时间:2023-05-23 11:03:49浏览次数:52  
标签:左子 preorder 遍历 07 Offer index 二叉树 inorder 节点

一、题目

输入某二叉树的前序遍历中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字

二、示例

2.1>示例 1:

图解LeetCode——剑指 Offer 07. 重建二叉树_子树

输入】preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出】[3,9,20,null,null,15,7]

2.2> 示例 2:

输入】preorder = [-1], inorder = [-1]
输出】 [-1]

限制:

  • 0 <= 节点个数 <= 5000

三、解题思路

根据题目描述,我们需要通过题目给出的一棵树的前序遍历中序遍历,来重建这棵二叉树。那么首先我们需要知道这两种遍历的方式是怎么样的:

前序遍历】首先访问根结点,然后遍历左子树,最后遍历右子树
中序遍历】首先遍历左子树,然后访问根节点,最后遍历右子树

那么,我们首先需要做的就是,通过前序遍历和后序遍历的遍历方式,来找到最近两层节点的关系,即:nodenode.leftnode.right;如下图所示,假设根节点所在前序遍历数组preorder的下标为:index,根据前序遍历规则我们可以得出如下结论:

子树根节点所在preorder数组中的位置index
左子树根节点所在preorder数组中的位置index + 1
右子树根节点所在preorder数组中的位置index + 左子树节点总和 + 1

而我们怎么获得左子树节点总和呢?这时候,我们就可以根据中序遍历规则来计算出来了,我们假设某一个子树中序遍历数组为inorder,那么根节点所在位置是pos,某子树范围在[start, end]之间,那么就可以得出如下结论:

左子树节点总和pos - start

图解LeetCode——剑指 Offer 07. 重建二叉树_子树_02

主要逻辑说完了,由于我们可以根据中序遍历+子树根节点位置划分左子树节点集合右子树节点集合,那么通过递归调用就可以重塑这棵二叉树了。

解题思路说完了,我们还是举例来看一下重塑二叉树的过程。输入preorder = [3,9,20,15,7], inorder = [9,3,15,20,7],请参数如下图中的图解所示,看一下具体的处理过程:

图解LeetCode——剑指 Offer 07. 重建二叉树_中序遍历_03

四、代码实现

public class Solution {
    int[] preorder;
    HashMap<Integer, Integer> mark; 
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if (preorder == null || inorder == null) return null;
        this.preorder = preorder;
        mark = new HashMap();
        for(int i = 0; i < inorder.length; i++)
            mark.put(inorder[i], i);
        return childNode(0, 0, inorder.length-1);
    }
    public TreeNode childNode(int root, int start, int end) {
        if (start > end) return null;
        TreeNode node = new TreeNode(preorder[root]);
        // 【子树根节点位置】index
        int index = mark.get(preorder[root]);
        // 【右子树根节点位置】index + 1
        node.left = childNode(root+1, start, index-1);
        // 【左子树根节点位置】index + 左子树长度(index-start)+ 1
        node.right = childNode(root+index-start+1, index+1, end); 
        return node;
    }
}

图解LeetCode——剑指 Offer 07. 重建二叉树_子树_04

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

标签:左子,preorder,遍历,07,Offer,index,二叉树,inorder,节点
From: https://blog.51cto.com/u_15003301/6330118

相关文章

  • 图解LeetCode——剑指 Offer 29. 顺时针打印矩阵
    一、题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。二、示例2.1>示例1:【输入】matrix=[[1,2,3],[4,5,6],[7,8,9]]【输出】[1,2,3,6,9,8,7,4,5]2.2>示例2:【输入】matrix= [[1,2,3,4],[5,6,7,8],[9,10,11,12]]【输出】[1,2,3,4,8,12,11,10,9,5,6,7]限......
  • 图解LeetCode——剑指 Offer 15. 二进制中1的个数
    一、题目编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为'1'的个数(也被称为 汉明重量)。二、示例2.1>示例1:【输入】n=11(控制台输入00000000000000000000000000001011)【输出】3【解释】输入的二进制串000000000000000000000000000010......
  • 图解LeetCode——654. 最大二叉树(难度:中等)
    一、题目给定一个不重复的整数数组 nums。 最大二叉树 可以用下面的算法从 nums递归地构建:1>创建一个根节点,其值为 nums中的最大值。2>递归地在最大值 左边 的 子数组前缀上 构建左子树。3>递归地在最大值右边的 子数组后缀上 构建右子树。返回 nums构建的......
  • 07-面向对象
    1.类和对象1.1类和对象的理解客观存在的事物皆为对象,所以我们也常常说万物皆对象。类类的理解类是对现实生活中一类具有共同属性和行为的事物的抽象类是对象的数据类型,类是具有相同属性和行为的一组对象的集合简单理解:类就是对现实事物的一种描述类的组成属性:指......
  • COMP90074 Web Security
    SchoolofComputingandInformationSystemsCOMP90074:WebSecurityAssignment3-ProjectPlutusDuedate:Nolaterthan11:59pmonSunday4thJune2023Weight:25%Markedoutof100Note:Allchallengeshaveaflagintheformat:FLAG{something_here}No......
  • #yyds干货盘点# LeetCode程序员面试金典:平衡二叉树
    题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例1:输入:root=[3,9,20,null,null,15,7]输出:true示例2:输入:root=[1,2,2,3,3,null,null,4,4]输出:false示例3:输入:root=[]......
  • 07-层次化设计 -- 全加器
    1.层次化设计数字电路中根据模块层次不同有两种基本的结构设计方法:自底向上的设计方法和自顶向下的设计方法1.1自底向上的设计方法(Bottom-Up)自底向上的设计是一种传统的设计方法,对设计进行逐次划分的过程是从存在的基本单元出发的(基本单元是已有的或者是购买的),有基本单......
  • 记一次IDEA运行maven命令异常退出,Process finished with exit code -1073741819 (0xC
    系统是基于ARM64的win11,问题根源也不是网传的金山毒霸,出问题的也不是我。起因,我一学弟想在他的微软surfacepro上装IDEA学java,然后给他整了个i586版本的jdk(也就是32位jdk).后面他学习的时候用到tomcat,然后一运行项目啊,发现tomcat是64位,32位的jdk运行不起来,然后把jdk换成了64......
  • 102. 二叉树的层序遍历
    classSolution{public:vector<vector<int>>res;voidbfs(TreeNode*root){queue<TreeNode*>q;q.push(root);intlast=0;while(!q.empty()){vector<int>level;......
  • LeetCode 103. 二叉树的锯齿形层次遍历
    classSolution{public:vector<vector<int>>res;voidbfs(TreeNode*root){queue<TreeNode*>q;q.push(root);intcnt=0;while(!q.empty()){vector<int>level;......