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

news2024/11/18 3:41:38

题目链接

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

题目描述


注意点

  • inorder.length == preorder.length
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

解答思路

  • 前序遍历的首个节点为根节点,可以根据根节点在中序遍历中的位置找到哪些节点属于左子树,哪些节点属于右子树
  • 如果每次都根据根节点的值在中序遍历中去查找位置,则会增加时间的开销,所以可以将中序遍历中的节点值及其在中序遍历中的位置存储到一个哈希表中,每次查找位置只需要花费O(1)的时间,以空间换时间
  • 通过递归的方法不断寻找每个子树的根节点及其左右子树,为了方便寻找,每次递归时需要传入preorder_left, preorder_right, inorder_left, inorder_right,其中preorder_left是当前子树在前序遍历中的第一个节点,也就是根节点,根据根节点在中序遍历中的位置可以与inorder_left推出其左子树的节点数量size,在此基础上可以继续递归推出该子树的左右子树

代码

class Solution {
    // 存储中序遍历关系映射
    Map<Integer, Integer> map;

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int n = inorder.length;
        map = new HashMap<>(n);
        for (int i = 0; i < n; i++) {
            map.put(inorder[i], i);
        }
        return buildMyTree(preorder, inorder, 0, n - 1, 0, n - 1);
    }

    public TreeNode buildMyTree(int[] preorder, int[] inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
        // 没有元素无法构成树
        if (preorder_left > preorder_right) {
            return null;
        }
        TreeNode root = new TreeNode();
        // 此时先序遍历左侧为根节点
        root.val = preorder[preorder_left];
        // 该树左子树的节点数量
        int size = map.get(root.val) - inorder_left;
        root.left = buildMyTree(preorder, inorder, preorder_left + 1, preorder_left + size, inorder_left, inorder_left + size);
        root.right = buildMyTree(preorder, inorder, preorder_left + size + 1, preorder_right, inorder_left + size + 1, inorder_right);
        return root;
    }
}

关键点

  • 理解前序遍历和中序遍历
  • 在每次递归左右子树时,理解应该怎样传入preorder_left, preorder_right, inorder_left, inorder_right四个值
  • 对于左子树,因为此时preorder_left已经作为根节点,所以传入preorder_left需要加1,preorder_right为preorder_left + size,inorder_left为inorder_left,inorder_right为inorder_left + size
  • 对于右子树,preorder_left为preorder_left + size + 1,preorder_right为preorder_right,因为此时inorder_left + size已经作为根节点,所以inorder_left为inorder_left + size + 1,inorder_right为inorder_right

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/634147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[架构之路-211]- 需求- 软架构前的需求理解:ADMEMS标准化、有序化、结构化、层次化需求矩阵 =》需求框架

目录 前言&#xff1a; 一、什么是ADMES: 首先&#xff0c;需求是分层次的&#xff1a; 其次&#xff0c;需求是有结构的&#xff0c;有维度的 再次&#xff0c;不同层次需求、不同维度需求之间可以相互转化&#xff08;难点、经验积累&#xff09; 最终&#xff0c;标准…

UnitTest 学习

UnitTest 一、UnitTest 基本使用1. TestCase 测试用例2. TestSuite 和 TestRunner3. TestLoader 测试加载4. Fixture 二、断言与参数化断言参数化 三、测试报告获取项目的绝对路径登录案例跳过 一、UnitTest 基本使用 UnItTest 框架介绍 UnitTest是python自带的一个单元测试框…

HTTP 和 HTTPS 协议原理【网络基础】

文章目录 1. HTTP 的优点2. HTTP 的缺点明文可能会被窃听通信方可能被伪装报文可能被篡改 2.1 弥补 HTTP 的缺点&#xff08;概述&#xff09;加密明文通信加密内容加密 验证通信方报文完整性校验 3. HTTPS 协议3.1 SSL/TLS 协议概述3.2 加密机制对称加密非对称加密混合加密 3.…

一文终结SQL 子查询优化

概要 子查询&#xff08;Subquery&#xff09;的优化一直以来都是 SQL 查询优化中的难点之一。关联子查询的基本执行方式类似于 Nested-Loop&#xff0c;但是这种执行方式的效率常常低到难以忍受。当数据量稍大时&#xff0c;必须在优化器中对其进行去关联化&#xff08;Decoor…

深入理解深度学习——Transformer:基础知识

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; 作为当下最先进的深度学习架构之一&#xff0c;Transformer被广泛应用于自然语言处理领域。它不单替代了以前流行的循环神经网络(recurrent neural network, RNN)和长短期记忆(long short-term memory, …

网络安全入门学习第十七课——PHP数组

文章目录 一、索引数组二、关联数组三、数组定义1、多维数组2、赋值方式3、短数组定义法&#xff08;[ ] PHP 5.4起增加的) 四、访问数组五、遍历数组1、使用 for 循环2、foreach语句遍历 六、合并两个数组1、“”联合运算符2、array_combine 函数 七、数组排序函数八、数组增删…

redis 全系列目录

redis常用资源_存在,及合理的博客-CSDN博客Redis 官网 推荐CRUG网站redis 中文 官网Spring Data Redis 客户端工具官网Distributed Locks with Redis | Redishttps://github.com/redisson/redisson 分布式锁实现大数据高并发Redis一本通-张文亮编著-微信读书 书籍推荐https://b…

Misc(三)

LSB 这题没见过&#xff0c;是看的wp 首先了解LSB是什么 LSB简介 最低有效位&#xff08; least significant bit&#xff0c;LSB&#xff09;指的是一个二进制数字中的最低位。最低有效位和最高有效位是相对应的概念。LSB是一种常被用做图片隐写的算法。LSB属于空域算法中的一…

学成在线----day6

1、断点续传 断点续传指的是在下载或上传时&#xff0c;将下载或上传任务&#xff08;一个文件或一个压缩包&#xff09;人为的划分为几个部分&#xff0c;每一个部分采用一个线程进行上传或下载&#xff0c;如果碰到网络故障&#xff0c;可以从已经上传或下载的部分开始继续上…

【文生图系列】Stable Diffusion原理篇

文章目录 Stable Diffusion的组成什么是扩散扩散是如何工作的去噪声绘制图像将文本信息添加到图像生成器中参考 “文生图”&#xff0c;或者AI绘画&#xff0c;最近异常火爆&#xff0c;输入一些描述性的语句&#xff0c;AI就能够生成相应的画作。甚至引发了一个问题&#xff1…

智能饮品柜颠覆升级,点赋科技引领行业跨越式发展

智能科技的迅速发展&#xff0c;不断改变人们的生活方式和商业模式&#xff0c;在众多领域迎来了新的机会和挑战。其中&#xff0c;饮品行业聚集了大量的消费者和商家&#xff0c;成为了一个具有广泛发展空间和潜力的市场。而在这个市场上&#xff0c;点赋科技认为智能饮品柜作…

ARM基础(3):MPU内存保护单元详解及例子

MPU(Memory Protection Unit)是ARM处理器中的一个特性&#xff0c;它提供了内存保护和访问控制的功能&#xff0c;通常用于实现操作系统的内存隔离和保护。比如我们可以设置所有的RAM为不可执行&#xff0c;这样就可以避免代码注入攻击。最近做项目过程中&#xff0c;使用的几个…

深度研究微软的资产负债表和财务状况以及未来投资价值

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 微软股票的关键指标 猛兽财经认为&#xff0c;微软公布的2023财年第三季度财务业绩&#xff0c;有三个关键指标值得投资者关注。 第一个关键指标是利息收入。微软的利息收入目前已经同比增长了44%&#xff0c;从2022财年第…

【Kubernetes存储篇】常见存储方案及场景分析

文章目录 一、持久化存储理论1、为什么要做数据持久化存储&#xff1f;2、常见持久化存储方案 二、案例&#xff1a;持久化存储方案1、emptydir临时存储卷2、hostPath本地存储卷3、NFS网络共享存储卷 一、持久化存储理论 官方中文参考文档&#xff1a; 1、为什么要做数据持久…

【三、网络配置与系统管理】

1 网络配置 ifconfig 显示网络接口的配置信息 [rootredis100 ~]# ifconfig ens33: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.100 netmask 255.255.255.0 broadcast 192.168.10.255inet6 fe80::f5c3:6a96:fe05:1965 prefixlen 64 scop…

该怎么学Python?自学Python的方法和资料整理!

导语 Python 作为一门简洁、易学且功能强大的编程语言&#xff0c;备受程序员和初学者的喜爱。如果你也想学习 Python&#xff0c;但不知从何入手&#xff0c;本文将为你整理一些自学 Python 的方法&#xff0c;助你快速入门并掌握这门语言。 为什么学习Python&#xff1f;&a…

【2023华中杯】C题 空气质量预测与预警 56页论文及Python代码

【2023华中杯】C题 空气质量预测与预警 56页论文及Python代码 1 题目 空气污染对人类健康、生态环境、社会经济造成危害&#xff0c;其污染水平受诸多因素的影响&#xff0c; 如 PM2.5、PM10、CO、气温、风速、降水量等&#xff0c;探究 PM2.5 等污染物浓度的因素&#xff0c…

POI导出Excel (满满的干货啊)

已经实现的POI导出Excel 步骤一&#xff1a;导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi…

【js】js前端技巧之图片格式转换(File、Blob、base64):

文章目录 一、类型简介二、BLOB 与 File&#xff1a;【1】BLOB 转 File【2】File 转 BLOB 三、 BLOB 与 base64&#xff1a;【1】BLOB(url) 转 base64【2】base64 转 BLOB 四、File 与 base64&#xff1a;【1】File 转 base64【2】base64 转 File 五、案例&#xff1a; 一、类型…

AWS CodeWhisperer 心得体会:安装与使用

大家好&#xff0c;今天我要和大家分享一下我在使用 AWS CodeWhisperer 这个工具时的心得体会。首先&#xff0c;让我们了解一下什么是 AWS CodeWhisperer。 什么是 AWS CodeWhisperer&#xff1f; AWS CodeWhisperer 是一个用于帮助开发者在 AWS 云平台上更轻松地编写、测试…