​面试经典150题——从前序与中序遍历序列构造二叉树

aerial photo of mountain range

1. 题目描述

image-20240417152807018

2.  题目分析与解析

二叉树的前序、中序和后序遍历

二叉树的前序、中序和后序遍历是树的三种基本遍历方式,它们是通过不同的顺序来访问树中的节点的。

  1. 前序遍历(Pre-order traversal)

    • 访问根节点

    • 前序遍历左子树

    • 前序遍历右子树

  2. 中序遍历(In-order traversal)

    • 中序遍历左子树

    • 访问根节点

    • 中序遍历右子树

  3. 后序遍历(Post-order traversal)

    • 后序遍历左子树

    • 后序遍历右子树

    • 访问根节点

每种遍历方式都有其特定的应用场景,以及在不同问题中的实用性。

  • 前序遍历常用于复制二叉树、计算表达式树的值等。

  • 中序遍历常用于搜索树(如二叉搜索树)中,可以按照从小到大的顺序访问所有节点。

  • 后序遍历通常用于释放二叉树的内存空间。

根据题目要求,我们可以从以下几个方面着手:

  1. 理解二叉树的性质

    通过这些性质,根节点在前序遍历中是容易找到的,而中序遍历中根节点的位置可以用来划分左子树和右子树。

    • 前序遍历(Preorder Traversal)的特点是根节点首先出现,接着是左子树的所有节点,最后是右子树的所有节点。

    • 中序遍历(Inorder Traversal)的特点是先遍历左子树,然后是根节点,最后是右子树。

  2. 使用哈希映射优化搜索

    • 而在中序遍历中频繁查找节点位置是一个时间复杂度较高的操作(O(n)),为了提升效率,可以使用哈希映射(HashMap)存储每个值与其在中序遍历中的索引。这样,节点位置的查找时间复杂度可以降低到O(1)。

    • 因为题目中提到了:

      image-20240418102452315

  3. 递归构建二叉树

    为什么使用递归求解?因为构建一棵二叉树无非就是三个步骤:创建根节点,构建左子树,构建右子树。因此这个问题就可以按照如下求解:

    但是注意递归求解肯定有返回条件,这个返回条件就是左边界大于右边界,也就是子树节点个数小于等于0的时候代表没有左子树了,返回null。所以有如下:

    • 递归基:如果前序遍历的子区间为空(即左边界大于右边界),这意味着没有子树可以构建,返回null

    • 创建根节点:前序遍历的第一个节点总是根节点,使用这个性质创建当前的根节点。

    • 计算左子树的大小:根据根节点在中序遍历中的位置和左边界的差值,可以确定左子树的节点数目。

    • 递归构建左子树:在前序遍历中,紧接根节点之后的一段连续序列对应于左子树的前序遍历,而在中序遍历中,根节点位置之前的一段序列对应于左子树的中序遍历。利用这两个序列,递归构建左子树。

    • 递归构建右子树:类似地,根据前序和中序遍历中左子树节点数的信息,可以确定右子树的前序和中序遍历序列,进而递归构建右子树。

    1. 构建根节点

    2. 找到左子树的部分构建左子树

    3. 找到右子树的部分构建右子树

    4. 返回根节点

3. 代码实现

image-20240418101734360

image-20240418101615273

4. 相关复杂度分析

时间复杂度

  1. 哈希映射构建

    • 遍历中序数组以构建哈希映射,时间复杂度为 (O(n)),其中 (n) 是树中节点的数量。

  2. 递归构建二叉树

    • 每次递归调用处理一个节点(根节点),因此每个节点会被访问一次。

    • 虽然递归多次,但每个节点仅在其对应的递归层次中处理一次,因此总的时间复杂度为 (O(n))。

总的时间复杂度:由于哈希映射的构建和递归构建树各占 (O(n)),总时间复杂度是 (O(n))。

空间复杂度

  1. 哈希映射

    • 哈希映射存储所有节点及其在中序遍历中的索引,占用 (O(n)) 的空间。

  2. 递归调用栈

    • 最坏情况下,二叉树是高度不平衡的,例如全部倾斜成一条直线,这时递归的深度为 (n),因此调用栈的最大深度也为 (O(n))。

    • 如果树是平衡的,递归的深度大约是 (log n)。

  3. 递归中的临时变量

    • 在每次递归调用中,使用了一些额外的空间来存储诸如 preorder_left, preorder_right, inorder_left, inorder_right, inorder_root_indexleft_tree_size 等变量,但这些都是常数空间,因此不影响总体空间复杂度。

总的空间复杂度:最坏情况下为 (O(n)),主要由于哈希映射和递归栈的空间需求。

结论

代码的时间复杂度为 (O(n)) 且空间复杂度为 (O(n))。这确保了算法在处理大规模数据时的效率和可行性,同时空间复杂度主要受递归深度和哈希映射的存储需求影响。这是构建二叉树时的典型性能表现,特别是当给定两种遍历结果时。

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

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

相关文章

详细介绍医用PSA变压吸附制氧机设备的工艺特点

随着技术的不断进步,医用氧气作为一种重要的治疗资源,其供应方式也在不断地改进和升级。其中,医用PSA(Pressure Swing Adsorption,变压吸附)变压吸附制氧机设备因其高效、安全、稳定的特点,受到了广大机构的青睐。那么…

Java高阶私房菜:快速学会异步编程CompletableFuture

为了使主程代码不受阻塞之苦,一般使用异步编程,而异步编程架构在JDK1.5便已有了雏形,主要通过Future和Callable实现,但其操作方法十分繁琐,想要异步获取结果,通常要以轮询的方式去获取结果,具体如下&#x…

传统零售行业如何做数字化转型?

传统零售行业的数字化转型是一个系统性的过程,涉及到企业的多个方面。以下是一些关键步骤和策略,帮助传统零售企业实现数字化转型: 1、明确转型目标和战略 首先,企业需要明确数字化转型的目标和战略。包括确定企业的核心竞争力、…

照片光晕光学特效模拟调色Boris FX Optics 2024 mac下载安装教程

Boris FX Optics 2024 Mac版是一款照片光晕光学特效模拟调色软件,旨在模拟光学相机滤镜,专用镜头,胶卷和颗粒,镜头光晕,光学实验室处理,色彩校正以及自然光和摄影效果。用户可以通过应用光学并从160个滤镜和…

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程 📍相关篇《Arduino通过I2C驱动MT6701磁编码器并读取角度数据》🎈《STM32 软件I2C方式读取MT6701磁编码器获取角度例程》📌MT6701当前最新文档资料:https://www.magntek.com.cn/u…

甘特图:项目管理者的必备神器,如何提高工作效率?

甘特图是什么?项目管理者大多都熟悉甘特图,它是一种直观展示项目计划执行过程的工具。通过条形图来显示项目、任务的时间安排,以及实际进度与计划进度的对比情况。 在我个人的项目管理实践中,甘特图确实帮助我提高了工作效率&am…

威纶通触摸屏与S7-1200进行标签通信(符号寻址)的具体方法示例

威纶通与S7-1200进行标签通信(符号寻址)的具体方法示例 前面和大家分享了威纶通与S7-1200通过绝对地址进行以太网通信的具体方法,具体内容可参考以下链接中的内容: 威纶通触摸屏与S7-1200以太网通信的具体方法和步骤(非常详细) 如下图所示,打开博途软件,新建一个项目,…

中国老铁路增开对国际旅客列车开行

4月13日,中老铁路国际旅客列车开行一周年之际,中老两国铁路部门在中国西双版纳至老挝琅勃拉邦两大著名旅游城市间增开1对国际旅客列车,旅客乘火车可实现两地间当日往返。标题:古道新程——中国老铁路增开国际旅客列车 在这个日新月…

图书管理系统概述

自友图书馆管理系统解决方案适用于中小学、大中专院校以及企事业单位中小型图书馆的自动化管理需求,其功能覆盖了图书馆自动化集成管理业务流程所包括的所有环节。《图书馆管理系统》首先应该按照我国图书馆行业通用CNMARC格式及《中图法第四版》行业标准开发而成,支…

linux运行ant 报错 Unable to locate tools.jar【已解决】

linux安装 ant 运行时报错 Unable to locate tools.jar. Expected to find it in /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.402.b06-1.el7_9.x86_64/lib/tools.jar 原因 已安装的jdk只有运行环境,没有tool.jar,而ant运行需要java开发环境,因…

第47篇:简易处理器<一>

Q:本期我们开始介绍一种数字系统----简易处理器,可以执行由指令指定的各种操作。 A:简易处理器包含多个9位寄存器、一个数据选择器、一个加/减法器单元和一个控制单元(有限状态机)。 数据选择器:可以将输入数据加载到各种寄存器&…

计算机网络-IS-IS基础概念二

前面已经学习了IS-IS的定义、组成、NET地址标识以及路由器级别分类等,今天继续学习IS-IS基础概念知识。 参考链接:IS-IS路由协议基础概念 一、IS-IS支持的网络类型 IS-IS会自动根据接口的数据链路层封装决定该接口的缺省网络类型, IS-IS支持两…

Biome 1.7 发布,支持从 ESLint 和 Prettier 迁移

近日,Biome v1.7 正式发布!这个新版本提供了从 ESLint 和 Prettier 迁移的简单路径。它还引入了格式化程序和 linter 的实验性机器可读报告、新的 linter 规则和许多修复。 使用以下命令更新 Biome: npm install --save-dev --save-exact b…

一篇文章带你快速认识区块链(必看)

引言 区块链技术,这一划时代的分布式账本技术,正在全球范围内掀起一场深度的信任与协作模式变革。区块链如同一部由多方共同维护的公开而又安全的大账本,每一笔交易都被打包成一个区块,通过高级密码学手段确保传输和访问安全&…

Axure如何实现限制选择项数量的交互

大家经常会看到这样的功能设计:可以多选,但是限制多选。比如某招聘网站城市的选择只能选择5个。再选择第6个的时候会提示最多只能选择5项。 这个效果是我们经常会遇到的,在工作中也经常会遇到需要制作这样的效果。今天我们一起来看看&#xf…

RabbitMQ-交换机

文章目录 交换机fanoutDirecttopicHeadersRPC 交换机 **交换机 **是消息队列中的一个组件,其作用类似于网络路由器。它负责将我们发送的消息转发到相应的目标,就像快递站将快递发送到对应的站点,或者网络路由器将网络请求转发到相应的服务器…

从二本调剂到上海互联网公司算法工程师:我的成长故事

探讨选择成为一名程序员的原因,是出于兴趣还是职业发展? 在这个科技飞速发展的时代,程序员这一职业无疑成为了许多人眼中的香饽饽。那么,是什么驱使着越来越多的人选择投身于这一行业呢?是出于对编程的热爱&#xff0…

SFusion论文速读

SFusion: Self-attention Based N-to-One Multimodal Fusion Block 摘要 人们用不同的感官感知世界,例如视觉、听觉、嗅觉和触觉。处理和融合来自多种模式的信息使人工智能能够更轻松地理解我们周围的世界。然而,当缺少模态时,可用模态的数…

使用Canal同步MySQL 8到ES中小白配置教程

🚀 使用Canal同步MySQL 8到ES中小白配置教程 🚀 文章目录 🚀 使用Canal同步MySQL 8到ES中小白配置教程 🚀**摘要****引言****正文**📘 第1章:初识Canal1.1 Canal概述1.2 工作原理解析 📘 第2章&…

Python多态

1.多态 多态定义:多态(polymorphism)是指同一个方法调用由于对象不同可能会产生不同的行为 注意以下2点: 1.多态是方法的多态,属性没有多态。 2.多态的存在有2个必要条件:继承、方法重写 class Animal:de…