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

ocean waves crashing on shore during daytime

1. 题目描述

image-20240419124533215

2.  题目分析与解析

其实这个题目和昨天那个很相似,思考思路如下:

解决从中序(inorder)与后序(postorder)遍历序列构造二叉树的问题时,考虑到这两个遍历序列为我们提供了树结构中节点的位置信息。

  1. 理解遍历序列的特性

    • 中序遍历:对于任何给定的树,中序遍历首先遍历左子树,然后是根节点,最后是右子树。因此,如果我们知道根节点的位置,我们可以确定哪部分是左子树,哪部分是右子树。

    • 后序遍历:后序遍历首先遍历左子树,然后是右子树,最后是根节点。在后序遍历的数组中,最后一个元素总是根节点。

  2. 使用后序遍历确定根节点

    • 根据后序遍历的特性,数组的最后一个元素是当前子树的根节点。这为我们提供了一个切入点,从后序数组的末尾开始构建树

  3. 利用中序遍历定位左右子树

    • 一旦我们从后序遍历中识别出根节点,我们可以在中序遍历数组中找到这个根节点的位置。根据中序遍历的性质,根节点将数组分割为左右子树。

    • 知道左右子树的节点数量后,我们可以递归地使用同样的方法构建左右子树。

  4. 使用HashMap优化查找

    • 在中序数组中频繁查找根节点的位置可能非常耗时,特别是在大数据集上。因此,通过使用HashMap来存储中序遍历中每个值的索引,我们可以将查找时间降到O(1)。

  5. 递归构建

    • 使用上述找到的索引和节点数,我们递归地构建左子树和右子树。每次递归都会缩小问题的规模,直至到达叶节点。

  6. 考虑边界情况

    • 在构建过程中,如果发现没有更多的节点可以用于构建子树(即左边界超过右边界),这时应该返回null,表示当前没有子树。

通过以上思路,利用中序和后序遍历的独特属性和递归方法,我们就可以高效地重构出原始的二叉树结构。

3. 代码实现

image-20240419130428087

4. 相关复杂度分析

时间复杂度

  1. 递归调用:我们对每个节点都执行一次递归操作,来构建这个节点作为根的子树。每次递归会处理一个节点,并且总的节点数量等于数组的长度。

  2. 查找根节点索引:使用HashMap存储中序遍历中每个元素的索引,使得每次查找根节点的索引时的时间复杂度降至O(1)。初始化这个HashMap的时间复杂度为O(n),其中n是遍历数组的长度。

  3. 计算左右子树的大小:这一步只涉及简单的算术运算,因此其时间复杂度为O(1)。

综上所述,虽然每次递归调用中包含了对HashMap的O(1)时间复杂度操作,但因为每个节点都会被处理一次,总的时间复杂度为O(n),其中n是树中节点的数量。

空间复杂度

  1. 递归栈的空间:在最坏情况下,如果树完全不平衡(例如,每个节点只有左子节点或只有右子节点),递归的深度可以达到n。因此,递归栈的空间复杂度为O(n)。

  2. HashMap的空间:HashMap存储了中序遍历中每个节点值及其对应的索引,因此需要O(n)的空间。

  3. 参数和临时变量:这些额外的存储需求相对较小,可以视为常数级别。

因此,算法的总体空间复杂度也是O(n),主要由递归栈和HashMap的存储需求决定。这种空间复杂度在二叉树的递归构建问题中是比较常见的,特别是在处理大型数据结构时需要注意这一点。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决方案 SHUTDOWN_STATE xmlrpclib.py line: 794 ERROR: supervisor shutting down

Supervisor操作命令 重新加载 Supervisor 配置: sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl restart all这将重新读取 Supervisor 的配置文件,更新进程组,然后重启所有进程。 查看 Supervisor 日志&#xff1…

尺取法知识点讲解

一、固定长度的情况: 最小和(sum) 输入N个数的数列,所有相邻的M个数的和共有N-M1个,求其中的最小值。 输入格式 第1行,2个整数N,M,范围在[3…100000],N>M。 第2行,有N个正…

R语言入门:“Hellinger“转化和“normalize“转化(弦转化)的公式表示与R代码实现

1、写在前面 vegan包中的decostand()函数为群落生态学研究提供了一些流行的(和有效的)标准化方法。有关decostand()函数标准化的一些标准化方法可以看我的另一篇笔记:R语言入门:vegan包使用decostand()函数标准化方法 由于在网络上没有找到关于这两个转…

Redis-键值设计

Redis-键值设计 1.设置key的规范 遵循基本格式:【业务名称】:【数据名】:【id】 可读性强,在客户端的情况下使用:如果前缀相同会分目录层级长度不超过44字节 string数据结构的三种类型,在44字节之内是embstring 内存…

鸿蒙应用开发之Web组件3

前面学习了从网上加载网页的显示,本文将要学习加载本地的网页。比如很多显示的内容,可以制作网页的文件格式,然后直接使用它来显示,就可以减少界面的制作。另外,当手机没有网络的时候,如果想从网络上获取内容就会失败,这时候可以使用本地的网页内容来代替。这样不会导致…

Python的Logging模块高级用法-日志处理

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 探索Python中的日志处理:Logging模块的高级用法 在Python应用程序中&#xff0…

lementui el-menu侧边栏占满高度且不超出视口

做了几次老是忘记,这次整理好逻辑做个笔记方便重复利用; 问题:elementui的侧边栏是占不满高度的;但是使用100vh又会超出视口高度不美观; 解决办法: 1.获取到侧边栏底部到视口顶部的距离 2.获取到视口的高…

【动态规划】dp 路径问题(不同路径、路径最小和、地下城游戏...)

文章目录 1. 前言 - 理解动态规划算法1.5 关于dp路径问题2. 例题2.1_不同路径Warning. 关于状态表示 3. 算法题3.1_不同路径II3.2_珠宝的最高价值3.3_下降路径最小和3.4_最小路径和3.5_地下城游戏关于状态表示的两种选法: 1. 前言 - 理解动态规划算法 关于 动态规划…

Pytorch 之torch.nn初探 池化--Pooling Layers

任务描述 本关任务:本关提供了一个Variable 类型的变量x,要求按照条件创建一个Conv2d变量conv,一个MaxPool2d变量pool,对x应用卷积和最大池化操作并赋值给变量outpout_pool,并输出outpout_pool 的大小。 相关知识 P…

Blerden4.1基础操作方法

软件安装 下载软件地址 中文文档 偏好设置 编辑——》偏好设置——》界面——》设置分辨率缩放 1.20 方便观看字体 设置快捷键 是为了方便几个3d软件都变成同一种操作方式 这样就不会自己搞混了 编辑——》偏好设置——》键位映射——》3D视图——》3D视图(全局…

将windows作为网关

开启转发 reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v IPEnableRouter /D 1 /f开启routing and remote access服务 这样局域网里面别的设备能通过windows进行上网 参考:https://www.cnblogs.com/chrishg/articles/12861053.html

Springboot+Vue项目-基于Java+MySQL的房屋租赁系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

OceanBase V4.2特性解析:用 Show Trace 快速定位数据库性能瓶颈

在数据库日常运维中,当遇到慢SQL问题时,若无法迅速查明原因,将极大地影响用户的使用感受,甚至可能引发业务或服务的中断。相较于单机数据库,分布式数据库系统因其涉及多个节点和多组件的协同工作,集群规模可…

短视频流媒体平台的系统设计

1. 功能需求: 我们的系统有两类参与者 内容创作者 •上传任何类型的视频(格式编解码器)•视频可以被删除•视频元数据•必填项: 标题,作者,描述•选填项: 分类/标签列表•可以随时更新•当视频对观众可用时,向内容创作…

怎么把相机储存卡里的照片导出来?介绍两种方法

随着摄影技术的不断发展和普及,相机已成为我们记录生活、捕捉美好瞬间的设备。然而,对于许多摄影爱好者来说,如何将相机储存卡里的照片安全、高效地导出到电脑或其他设备中,却成为了一个令人头疼的问题。本文将为您详细介绍从相机…

17.C++常用的算法_集合算法

文章目录 遍历算法1. set_intersection()代码工程运行结果 2. set_union()代码工程运行结果 3. set_difference()代码工程运行结果 遍历算法 1. set_intersection() 代码工程 /*1.求交集的两个集合必须是有序序列*/ /*2.目标容器开辟空间需要从两个容器中取较小值*/ /*3.set…

小程序中使用HTTPS调用自带文本安全内容检测接口(msg_sec_check)的实现方法

在小程序中调用自带的文本安全内容检测接口,你需要使用小程序提供的wx.request方法。以下是一个示例代码: javascript代码: // 假设你已经获取了access_token,如果不知道如何获取,可以参考我上一篇文章 const access_token 你的access_tok…

【结构型模式】外观模式

​一、外观模式概述 外观模式定义与意图:外观类为复杂的子系统提供了一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。(对象结构型模式) 外观模式的特点: 1.又叫做门面模式&#xf…

电磁炉原理笔记

电磁炉加热原理 【电磁炉工作原理,电涡流感应加热原理】 https://www.bilibili.com/video/BV11M411M7Wt/?share_sourcecopy_web&vd_source44c5c5fe44538189ece80f09460cf625 我是看的这个科普视频; 总结一下就是下图: 线圈的磁场影响…

链表判环问题

1、为什么slow走一步,fast走两步,会不会错过?请证明。 假设slow进环的时候fast和slow之间的距离时N,slow进环以后,fast开始追击slow每走一步,fast走2步,他们之间的距离缩小1. fast和slow之间的…