面试经典150题——二叉树展开为链表

white and blue surfboard on beach during daytime

1. 题目描述

image-20240422220201508

2.  题目分析与解析

2.1 思路一

因为题目中提到:展开后的单链表应该与二叉树 先序遍历 顺序相同,那么我们是不是就可以先先序遍历,然后按照先序遍历的节点一个一个赋值?

其实最简单的思路就是用一个结构按顺序存储所有先序遍历的结果,然后一个一个进行连接,但是这样空间复杂度为O(n),因为这种思路比较简单就不过多赘述了。

我在这里提出的思路是在先序遍历的过程中,进行链表的构建。如果按照这种思路,听起来好像没什么问题,但是如果我进行先序遍历,首先遍历根节点,需要把左节点置空,就会出现下面的情况:

image-20240423100605336

可以看到5,6节点断掉了。所以我们就得用一个结构存储那些断掉的部分,又因为在先序遍历中最先断掉的部分会在遍历过程中也最后被遍历到,所以我们可以使用栈,利用栈的先进后出,存储断掉的部分。这样就有下面的情况:

image-20240423102221202

然后这时左边节点发现遍历完毕之后,从栈中取出栈顶4号节点,继续进行上述操作:

image-20240423105601522

整体思路:

  1. 按照前序遍历的顺序,用栈存储丢失的右子树节点

  2. 递归构建左子树的链表

  3. 从栈中取出节点递归构建右子树的链表

2.2 思路二

参考windliang - 力扣(LeetCode)

因为题目中提到了

image-20240423104842927

那么我们就要想办法把这个栈空间给省略掉,所以我们首先要弄清楚栈到底存的什么东西。其实栈就是不断地存储那些被丢失的右节点。

右节点?既然我们担心右节点丢失,那么我们就可以先把右节点是不是先放在二叉树的某个位置,保存起来,这样就不需要再用栈来额外存储这些右节点了。那到底存储在哪呢?先看一下结果:

img

我们可以发现右节点总是在左子树的最右节点的后面,对应上图就是 5在4后面——对应1的左子树最右边一个节点为4,4在3后面——对应2的左子树最右边一个节点为3(因为2的左子树就只有3)。对应图解为:

image-20240423112000454

因此我们是不是可以先把右子树存储在左子树最右边一个节点的后面,这样就不需要栈来存储了。现在我们就需要考虑怎么找到左子树的最右边一个节点,然后把右子树接到这个节点后面。之后再看root.right下一个节点,以此类推就可求解。

整体思路:

  1. 将左子树插入到右子树的地方

  2. 将原来的右子树接到左子树的最右边节点

  3. 考虑新的右子树的根节点,一直重复上边的过程,直到新的右子树为 null

2.3 思路三

现在还是抓住问题的本质,我们需要省略掉栈保存的右节点。上面思路二的想法是用左子树的最右节点来临时存储右子树,那么我们可不可以从后往前去遍历,先遍历右子树的部分,然后把这部分的根节点这一个节点存储起来,再遍历左子树,也就是按照后序遍历的变种右子树->左子树->根节点的方式进行处理。

后序遍历(Postorder Traversal):先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。

具体步骤:

  1. 递归地后序遍历左子树。

  2. 递归地后序遍历右子树。

  3. 访问根节点。

我们依次遍历 6 5 4 3 2 1,然后每遍历一个节点就将当前节点的右指针更新为上一个节点。

遍历到 5,把 5 的右指针指向 6。6 <- 5 4 3 2 1。

遍历到 4,把 4 的右指针指向 5。6 <- 5 <- 4 3 2 1。

按照这样的方式我们只需要一个临时变量存储前序节点就可以了。

3. 代码实现

3.1 思路一

image-20240423104809614

image-20240423104544306

3.2 思路二

image-20240423112845424

image-20240423112832413

3.3 思路三

image-20240423114600786

image-20240423114432394

4. 相关复杂度分析

  1. 解法一:使用递归和栈

    • 时间复杂度:O(n),其中 n 是二叉树中的节点数。递归函数 createLinkedList 遍历了每个节点一次。

    • 空间复杂度:O(h),其中 h 是二叉树的高度。在最坏情况下,栈的深度为 h,即二叉树的高度。

  2. 解法二:迭代方法

    • 时间复杂度:O(n),其中 n 是二叉树中的节点数。每个节点最多被访问两次。

    • 空间复杂度:O(1)。没有使用额外的空间,只使用了常数级别的额外空间。

  3. 解法三:使用递归和全局变量

    • 时间复杂度:O(n),其中 n 是二叉树中的节点数。递归函数 postOrder 遍历了每个节点一次。

    • 空间复杂度:O(h),其中 h 是二叉树的高度。递归调用栈的深度取决于二叉树的高度。

image-20240301121908772

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

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

相关文章

加速大数据分析:Apache Kylin使用心得与最佳实践详解

Apache Kylin 是一个开源的分布式分析引擎&#xff0c;提供了Hadoop之上的SQL接口和多维分析&#xff08;OLAP&#xff09;能力以支持大规模数据。它擅长处理互联网级别的超大规模数据集&#xff0c;并能够进行亚秒级的查询响应时间。Kylin 的主要使用场景包括大数据分析、交互…

Web前端安全问题分类综合以及XSS、CSRF、SQL注入、DoS/DDoS攻击、会话劫持、点击劫持等详解,增强生产安全意识

前端安全问题是指发生在浏览器、单页面应用、Web页面等前端环境中的各类安全隐患。Web前端作为与用户直接交互的界面&#xff0c;其安全性问题直接关系到用户体验和数据安全。近年来&#xff0c;随着前端技术的快速发展&#xff0c;Web前端安全问题也日益凸显。因此&#xff0c…

Altair:Python数据可视化库的魅力之旅

目录 一、引言 二、Altair概述 三、Altair的核心特性 1.声明式语法 2.丰富的图表类型 3.交互式与响应式 4.无缝集成 四、案例与代码实践 案例一&#xff1a;使用Altair绘制折线图 案例二&#xff1a;使用Altair绘制热力图 五、新手入门指南 1.安装与导入 2.数据准…

Nacos服务注册中心

1.引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>2.application.properties中配置 # 应用名称 spring.application.namenacos-aserver…

美国洛杉矶服务器的特点

美国洛杉矶的服务器提供多种优质的托管服务&#xff0c;具有较好的网络连接速度和稳定性。以下是一些洛杉矶服务器的特点和服务&#xff0c;rak小编为您整理发布。 1. **地理位置优势**&#xff1a;位于美国西海岸的洛杉矶机房离中国相对较近&#xff0c;这有助于减少延迟&…

指针专题(4)【qsort函数的概念和使用】

1.前言 上节我们学习了指针的相关内容&#xff0c;本节我们在有指针的基础的条件下学习一下指针的运用&#xff0c;那么废话不多说&#xff0c;我们正式进入今天的学习 2.回调函数 我们既然已经学习了指针的相关基础&#xff0c;那么我们此时就可以用指针来实现回调函数 而回…

如何在在wordpress安装百度统计

前言 看过我的往期文章的都知道&#xff0c;我又建了一个网站&#xff0c;这次是来真的了。于是&#xff0c;最近在查阅资料时发现&#xff0c;有一款免费的软件可以帮我吗分析网站数据。&#xff08;虽然我的破烂网站压根没人访问&#xff0c;但是能装上的都得上&#xff0c;…

python爬虫 - 爬取html中的script数据(爬取 zum.com新闻)

文章目录 1. 分析页面内容数据格式2. 使用re.findall方法&#xff0c;编写爬虫代码3. 使用re.search 方法&#xff0c;编写爬虫代码 1. 分析页面内容数据格式 &#xff08;1&#xff09;打开 https://zum.com/ &#xff08;2&#xff09;按F12&#xff08;或 在网页上右键 --…

免 Administrator 权限安装软件

以欧路词典为例, 从官网下载的安装包 https://www.eudic.net/v4/en/app/download 直接运行会弹出 UAC 提示需要管理员权限. 一个词典而已, 为啥要管理员权限呢? 答案是安装程序默认使用的安装路径是 C:\Program Files\ 这就不难理解了. 对于这种不需要其他额外权限的软件, 可以…

以赛促学、生态共建 | 软通动力子公司鸿湖万联成功举办基于x86架构的OpenHarmony应用生态挑战赛

近日&#xff0c;由开放原子开源基金会、央视网、江苏省工业和信息化厅、无锡市人民政府、江苏软件产业人才发展基金会、苏州工业园区、无锡高新区等共同承办&#xff0c;鸿湖万联参与共建的“基于x86架构的OpenHarmony应用生态挑战赛”决赛路演在无锡圆满落幕。本次挑战赛历时…

【THM】Linux Privilege Escalation(权限提升)-初级渗透测试

介绍 权限升级是一个旅程。没有灵丹妙药,很大程度上取决于目标系统的具体配置。内核版本、安装的应用程序、支持的编程语言、其他用户的密码是影响您通往 root shell 之路的几个关键要素。 该房间旨在涵盖主要的权限升级向量,并让您更好地了解该过程。无论您是参加 CTF、参加…

【C++学习】STL之空间配置器之一级空间配置器

文章目录 &#x1f4ca;什么是空间配置器✈STL 提供六大组件的了解&#x1f440;为什么需要空间配置器&#x1f44d;SGI-STL空间配置器实现原理&#x1f302;一级空间配置器的实现 &#x1f4ca;什么是空间配置器 空间配置器&#xff0c;顾名思义就是为各个容器高效的管理空间…

录制课程用什么软件好?这2款软件让你脱颖而出

在当今这个信息化快速发展的时代&#xff0c;录制课程已经成为了一种常见的教学手段。无论是高校教师、培训师还是网络教育工作者&#xff0c;都需要借助一些软件来录制高质量的课程。那么&#xff0c;录制课程用什么软件好呢&#xff1f;接下来&#xff0c;本文将介绍两种常见…

DxO Nik Collection 6.10.0 8套滤镜胶片插件套件mac/win

DxO Nik Collection 6是一款专为摄影师和图像创作者打造的强大后期处理工具。无论是专业摄影师还是业余爱好者&#xff0c;它都能为您的照片带来前所未有的提升。 这款软件集合了众多经典的Nik滤镜插件&#xff0c;如Color Efex Pro、Silver Efex Pro等&#xff0c;以及新增的P…

微信抽奖活动怎么做_微信抽奖大狂欢

随着科技的飞速发展&#xff0c;微信已经成为我们生活中不可或缺的一部分。它不仅仅是一个简单的通讯工具&#xff0c;更是一个集社交、购物、娱乐等多种功能于一体的平台。今天&#xff0c;我们为大家带来了一场别开生面的微信抽奖活动&#xff0c;让你在享受乐趣的同时&#…

Linux CentOS 7中Nginx 1.8.0 安装SSL证书

文章目录 前言一、创建一个文本文件&#xff0c;将每个证书的内容复制并粘贴到文件中二、将证书文件和私钥上传服务器三、编辑nginx的配置文件四、重新载入nginx配置文件五、使用浏览器访问自己的域名测试证书是否成功即可六、服务器证书的备份与恢复注意 前言 要在Nginx中安装…

面试题集中营—分布式共识算法

分布式共识算法目标 分布式主要就是为了解决单点故障。一开始只有一个服务节点提供服务&#xff0c;如下图所示。那么如果服务节点挂了&#xff0c;对不起等着吧。 为了服务的高可用性&#xff0c;我们一般都会多引入几个副节点当备份&#xff0c;当服务节点挂了&#xff0c;就…

羊大师:夏季羊奶的好处有哪些?

夏季羊奶的好处主要包括以下几点 1.增强免疫力&#xff1a;羊奶中的钙元素丰富&#xff0c;能有效为身体补充营养物质&#xff0c;增强自身的免疫能力。羊奶还富含上皮细胞生长因子&#xff08;EGF&#xff09;&#xff0c;对人体鼻腔、咽喉、血管、肠胃等黏膜有良好的修复作用…

day83 AJAX

1什么是AJAX AJAX语法 AJAX Asynchronous JavaScript and XML 异步js和XML 实现页面某一部份更新&#xff0c;无需服务器转发或重定向 1 $.ajax() 语法: $.ajax( { "url" : "url&qu…

Android11 SystemUI clock plugin 插件入门

插件的编写 参照ExamplePlugin&#xff0c;需要系统签名。 需要先编译以下模块得到jar&#xff0c;引用在项目中。 m SystemUIPluginLibcom.android.systemui.permission.PLUGIN PluginManager.addPluginListener SystemUI 是如何发现 clock plugin 的&#xff1f; Syste…