剑指Offer07:重建二叉树(Java)

2023-11-16

题目描述:
在这里插入图片描述
解法思路:
    一开始想了半个小时都没想出来,幸好得到大佬的帮助,终于做出来,嘻嘻。
    采用递归的思想,不断拆分左右子树即可。首先我们通过前序遍历可以看到这个树的根节点是3,然后通过中序遍历,我们可以知道9是左子树,15,20,7是右子树。所以一开始我们使用一个map集合存放中序遍历的数组元素和索引值。当通过前序遍历知道根节点后,通过map集合查询获得根节点在中序遍历数组的位置,那么它左边的元素是左子树,右边的元素是右子树。
    我们可以看到左子树的根节点,是在根节点下个位置。而右子树的根节点,是在根节点加上左子树元素个数的下个位置。每层的树,我们还应该设置它的左右边界。每下一层,边界也随之改变。当遍历到叶子节点时候,左边界大于右边界时,return null就可以结束递归条件啦。

代码实现:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private Map<Integer,Integer> inordermap=new HashMap<>();
    private int[] preorder;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        this.preorder=preorder;
        for(int i=0;i<inorder.length;i++){
            inordermap.put(inorder[i],i);
        }
        return bianli(0,0,inorder.length-1);
    }

    TreeNode bianli(int root,int leftline,int rightline){
        if(leftline>rightline) return null;
        TreeNode node=new TreeNode(preorder[root]);
        node.left=bianli(root+1,leftline,inordermap.get(preorder[root])-1);
        node.right=bianli(root+inordermap.get(preorder[root])-leftline+1,inordermap.get(preorder[root])+1,rightline);
        return node;
    }
}

执行结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剑指Offer07:重建二叉树(Java) 的相关文章

随机推荐

  • ESP32C3解锁使用IO11

    目录 1 使用pip安装esptool 2 安装idf开发命令行环境 可参考 3 将开发板插入电脑 4 打开IDF CMD命令行 5 打开命令行窗口 源自官方wiki 本篇介绍如何给ESP32C3多释放一个io ESP32C3的GPIO11
  • 如何从JavaScript数组中获取多个随机唯一元素?

    The JavaScript is a very versatile language and it has a function almost everything that you want JavaScript是一种非常通用的语言 它
  • Everything使用攻略和技巧

    Everything使用技巧 www hi channel com出品本文为H4海畅智慧原创文章 未经允许不得进行商业盈利性转载 非盈利性商业转载请注明出处www hi channel com 1 Everything下载地址 http w
  • access和tagware_通信缩略语

    英文缩写 英文名称 中文名称 3G The third generation mobile communications 第 3 代 移动通信 3GPP2 3rd Generation Partnership Project 2 3G 协作
  • 在论文开题报告中,研究目的和研究意义两者之间有什么区别吗?

    相信很多同学在接触论文的时候 会分不清研究目的和研究意义两者之间有什么区别 别着急 通过对大量文献的分析并根据数位研究生导师的讲解 这里总结出一篇针对二者区别的详细解读 全文大约有2000字 利用理论和实例全方位为大家解惑 选题的目的和意义
  • 【Spring Boot 集成应用】Spring Boot Admin的集成配置使用

    1 Spring Boot Admin 简介 Spring Boot Admin是一个开源社区项目 用于管理和监控SpringBoot应用程序 每个应用都认为是一个客户端 通过 HTTP 或者使用 Eureka 注册到 admin serv
  • 数字图像处理第十一章

    表示和描述 由于本章注重于如何存储 以后学习过程中多半不会用到该章节的知识 因此本章只做大概介绍 不再使用代码进一步说明 将一幅图像分割成多个区域后 分割后的像素集需要以一种合适于计算机进一步处理的形式来表示和描述 表示 表示一个区域的两种
  • sql2008计算机环境,win2008r2下安装sql2008r2初版

    步骤一 安装前的准备 软件要求 1 SQL Server 安装程序安装该产品所需的以下软件组件 NET Framework 3 5 SP11 SQL Server Native Client SQL Server 安装程序支持文件 2 所有
  • 洗牌牛客网

    链接 https www nowcoder com questionTerminal 5a0a2c7e431e4fbbbb1ff32ac6e8dfa0 来源 牛客网 洗牌在生活中十分常见 现在需要写一个程序模拟洗牌的过程 现在需要洗2n张牌
  • Matlab——回归分析

    基础知识 函数ones a b 产生a行b列全1数组 ones a 产生a行a列全1数组 zeros 同理 Y y Y为y的转置矩阵 函数size 获取数组的行数和列数 1 s size A 当只有一个输出参数时 返回一个行向量 该行向量的
  • MG995舵机控制

    左右按键 单次旋转15度 锁相环不分频 倍频 只是为了锁定频率 KEY M键旋转到中间位置 舵机的控制脉冲是0 5ms 2 5ms 1 5ms时居中 但是会存在一定的偏差 1 2 Module MG995 3 Author YangFei
  • JDK1.8 AbstractQueuedSynchronizer的实现分析(上)

    深度解析Java 8 JDK1 8 AbstractQueuedSynchronizer的实现分析 上 作者 刘锟洋 发布于 2014年7月31日 http www infoq com cn articles jdk1 8 abstract
  • 使用uniapp开发ChatGPT,跨平台开发流式输出,一套代码,全段通用!

    什么是uniapp 根据官网介绍 uni app 是一个使用 Vue js 开发所有前端应用的框架 开发者编写一套代码 可发布到iOS Android Web 响应式 以及各种小程序 微信 支付宝 百度 头条 飞书 QQ 快手 钉钉 淘宝
  • 解决:ProTable一次勾选上千条数据并分页勾选,页面卡顿问题

    一 安装插件virtuallist antd npm install save virtuallist antd 二 在页面中设置Protable组件的components属性即可 demo tsx import useMemo from
  • 【微服务系列】Spring SpringMVC SpringBoot SpringCloud概念、关系及区别

    一 正面解读 Spring主要是基于IOC反转Beans管理Bean类 主要依存于SSH框架 Struts Spring Hibernate 这个MVC框架 所以定位很明确 Struts主要负责表示层的显示 Spring利用它的IOC和AO
  • C#winform窗体的添加查询

    固定资产信息表 利用 net 的 Winforms 技术实现某公司管理整个公司的固定资产 而本系统功的功能实现 固定资产的添加管理 页面 一个主页面 数据库设计 create database AssetDB 创建数据库 go use As
  • Shell中的括号、双括号、方括号和双方括号

    括号 括号一般在命令替换的时候使用 bin bash today date y m d touch log today 双括号 使用双括号 在比较过程中使用高级数学表达式 符号 描述 val 后增 val 后减 val 先增 val 先减
  • matlab 直通滤波

    目录 一 算法原理 1 算法概述 2 实现流程 二 代码实现 三 结果展示 1 x字段滤波 2 y字段滤波 3 z字段滤波 一 算法原理 1 算法概述 直通滤波的作用是过滤掉在指定维度方向上取值不在给定值域内的点 2 实现流程 首先 指定一
  • ftp linux 开启验证_在linux下开启FTP服务方法介绍

    1 首先服务器要安装ftp软件 查看是否已经安装ftp软件下 which vsftpd 如果看到有vsftpd的目录说明服务器已经安装了ftp软件 如果没有安装ftp软件的话 这里有下载地址和相关教程可以参考 2 查看ftp 服务器状态 s
  • 剑指Offer07:重建二叉树(Java)

    题目描述 解法思路 一开始想了半个小时都没想出来 幸好得到大佬的帮助 终于做出来 嘻嘻 采用递归的思想 不断拆分左右子树即可 首先我们通过前序遍历可以看到这个树的根节点是3 然后通过中序遍历 我们可以知道9是左子树 15 20 7是右子树