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

news2024/11/22 9:46:24

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.coloradmin.cn/o/1608070.html

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

相关文章

五种主流数据库:集合运算

关系型数据库中的表与集合理论中的集合类似,表是由行(记录)组成的集合。因此,SQL 支持基于数据行的各种集合运算,包括并集运算(Union)、交集运算(Intersect)和差集运算&a…

本地项目如何设置https——2024-04-19

问题:由于项目引用了html5-qrcode插件,但是该插件在本地移动端调试时只能使用https访问,所有原本的本地地址是http,就需要改成https以方便调试。 解决方法:使用本地https证书 1)从项目文件下打开cmd逐步输…

AOP基础

一、AOP概述 AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实就是面向特定方法编程。 使用场景:①记录操作日志;②权限控制;③事务管理等。 优势:①代码无侵入…

SRS服务接入华为云CDN

一、srs配置 正常的标准配置即可,需打开hls推流即可,一般配置中默认打开 二、华为云cdn配置 1.登录华为云,找内容分发网络cdn 2.点击域名管理,点击添加域名 3.配置加速域名 4.选择点播加速 5.添加源站 配置源站地址&#xf…

2024年【G1工业锅炉司炉】考试及G1工业锅炉司炉考试内容

题库来源:安全生产模拟考试一点通公众号小程序 2024年【G1工业锅炉司炉】考试及G1工业锅炉司炉考试内容,包含G1工业锅炉司炉考试答案和解析及G1工业锅炉司炉考试内容练习。安全生产模拟考试一点通结合国家G1工业锅炉司炉考试最新大纲及G1工业锅炉司炉考…

删除顺序表中所有值为X的元素(顺序表,单链表)

目录 时间复杂度为O(1)(顺序表):代码实现: 运行结果: 时间复杂度为O(n)(顺序表):代码实现: 运行结果: 单链表:时间复杂度o(n):代码实现: 时间复杂度为O(1…

20240415,构造函数和析构函数,拷贝构造函数调用时机规则

目录 二,对象的初始化和清理 2.1 构造函数和析构函数 2.2 函数分类及调用 2.3 拷贝构造函数调用时机 2.4 构造函数调用规则 二,对象的初始化和清理 2.1 构造函数和析构函数 解决初始化和清理问题,编译器自动调用,如果不提…

探索异常传播:深入剖析Python中的错误处理机制

文章目录 1. 异常传播的基本原理2. 复杂的异常传播场景3. 再次抛出异常的意义是什么?4. 最佳实践与异常处理策略 理解异常传播(也称为异常冒泡)的过程是至关重要的。这一机制确保当在程序执行中发生错误时,错误能被有效地捕获和处…

CentOS7下安装mysql8或者mysql5.7

mysql8 1、下载 访问mysql官网下载mysql8软件包 https://dev.mysql.com/downloads/mysql/ 选择相应的版本如:RPM Bundle mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar RPM Bundle 8.0.33 下载地址:https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.…

springboot结合vue实现文件上传下载功能

紧接着上一次的博客,这次来实现一下文件(主要是图片)的上传和下载功能,上一次的博客如下所示: Springboot集成JWT token实现权限验证-CSDN博客 其实文件的上传和下载功能(后端的部分),在我之前的博客就已经有写了,所以…

【学习】关于测试技术的重要性和挑战有哪些

随着信息技术的飞速发展,软件产品已成为现代社会不可或缺的一部分。在软件研发过程中,测试技术的重要性日益凸显。它不仅是确保软件质量的关键环节,也是降低软件故障风险、提高用户体验的重要手段。然而,测试技术也面临着诸多挑战…

【触想智能】如何选购到一款合适的工业电脑一体机

工业电脑一体机是专为工业环境而设计的一种工业计算机。工业电脑一体机和普通的计算机不一样,它对产品的参数性能要求很高,因为它们通常会运行在高低温、电磁干扰、高粉尘、湿度大的恶劣环境中,所以相应的要求工业电脑一体机必须具备良好的宽…

Qt日志使用

QsLog使用 这篇讲qt的日志还是比较好的,可以在自己的函数里面配置这个日志框架实现自己所需的功能。 我接触的项目里面,假如有个函数功能执行错误了,我希望可以快速定位到这个错误,这个时候就需要到了日志,我咨询了有经…

LeetCode 113—— 路径总和 II

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 看到树的问题一般我们先考虑一下是否能用递归来做。 假设 root 节点的值为 value,如果根节点的左子树有一个路径总和等于 targetSum - value,那么只需要将根节点的值插入到这个路径列表中…

VUE 页码分页封装

VUE 页码封装组件 pagination/index.vue &#xff1a; <template><div class"pagination-contianer"><el-pagination background layout"prev, pager, next" :total"total" current-change"currentChange"> </e…

jdk17 +MAT进行内存分析

MemoryAnalyzer要进行内存分析&#xff0c;需要Dump快照 文件 手动获取Dump快照 文件 jmap -dump:live,formatb,file/path/to/heapdump.hprof <PID>然后再MAT 进行分析&#xff1a;

基于达梦数据库开发-C#篇

文章目录 前言一、相关准备二、主要代码1.引入达梦类库2.连接达梦数据库3.DmCommand方式获取达梦数据库信息4.DmDataAdapter方式获取达梦数据库信息 总结 前言 达梦数据库是国产的新一代大型通用关系型数据库&#xff0c;全面支持 SQL 标准和主流编程语言接口/开发框架。其中.…

LD-Pruner、EdgeFusion(On-Device T2I)、FreeDiff、TextCenGen、MemLLM

本文首发于公众号&#xff1a;机器感知 https://mp.weixin.qq.com/s/KiyNfwYWU-wBiCO-hE9qkA 苏 The devil is in the object boundary: towards annotation-free instance segmentation using Foundation Models Foundation models, pre-trained on a large amount of data…

arm64-v8a、armeabi-v7a、x86、x86_64

当我们去GitHub下载应用的时候是不是经常很懵逼&#xff0c;就像下图一样&#xff0c;粗看一下如此多安装包到底要选择下载哪个且每种安装包到底有哪差别&#xff1f;毕竟因为自己一无所知&#xff0c;有时便随意下载一个后&#xff0c;安装时却报『此版本与你的系统不兼容』的…

TCP三次握手,但通俗理解

如何用通俗的语言来解释TCP&#xff08;传输控制协议&#xff09;的三次握手过程&#xff1f; 想象一下你正在和朋友电话沟通&#xff0c;但你们之间不是心灵感应&#xff0c;而是需要通过清晰地听到对方的声音来确认通话质量良好。TCP三次握手就像是在电话拨通之前&#xff0…