从零学算法(剑指 Offer 36)

news2024/10/7 14:31:51

123.输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
为了让您更好地理解问题,以下面的二叉搜索树为例:请添加图片描述
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

  • 他人题解:首先中序遍历模板如下
  •   dfs(Node cur){
      	if(cur==null)return;
      	dfs(cur.left);  //前
      	solve cur...	//中
      	dfs(cur.right); //后
      }
    
  • 首先为了构建双向连接,我们肯定要定义当前遍历节点的前一个节点 pre。由于最后要返回链表头结点,所以定义一个头结点 head。我们在 dfs 的当前节点处理部分,根据题意很容易想到,无非就是连接前后(当前节点与左节点,或当前节点和右结点)两个节点,然后更新 pre 为当前节点,也就是 cur.left=pre, pre.right=cur, cur=pre。但是在递归时第一次处理当前节点时,也就是头节点时,是没有 pre 给他连接的(按道理应该连接尾结点,可这时刚开始操作,还没拿到尾结点),所以就特判一下,如果 pre 为 null 说明此时在处理的是头结点,就不让 pre 连接它了,而是让 head = cur,这也正好,我们最后要返回的 head 在这一步就得到了。dfs 结束后,pre 此时是指向尾结点的,这时就可以完成之前没连接的,让 head.left = pre(此时为尾结点),然后 pre.right=head。
  •   Node pre, head;
      public Node treeToDoublyList(Node root) {
          if(root == null) return null;
          dfs(root);
          head.left = pre;
          pre.right = head;
          return head;
      }
      void dfs(Node cur) {
          if(cur == null) return;
          dfs(cur.left);
          // 有 pre 就连,否则说明为头节点
          if(pre != null) pre.right = cur;
          else head = cur;
          // cur 为头节点时先连个 null 也无所谓,反正 dfs 结束后会连正确的尾结点
          // 在其他情况下就能正确连接当前节点和他的前一个节点了
          cur.left = pre;
          pre = cur;
          dfs(cur.right);
      }
    

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

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

相关文章

智能界面组件DevExpress BI Dashboard — 新的导出功能(v23.1)

在DevExpress v23.1发布周期中,官方扩展了DevExpress BI Dashboard项的导出功能,这些增强功能适用于WinForms、WPF和Web平台,包括以下选项: 将自定义Dashboard项导出到Excel并自定义导出的文档本身在导出期间自定义Pivot Grid Da…

数组——二分查找

二分查找前提条件 数组是有序的数组中没有重复的元素 二分方法一般有两种写法 一 左闭右闭 当左大于右时,整体结束。 如果左小于等于右则继续查找。 每次mid 左加((右减左)/2)除2操作也可以看做时右移一位 如果mid 值为目标则返回 否则mi…

CA证书颁发机构服务器

目录 一、CA证书颁发机构是什么? 二、数字证书可以干什么? 三、PKI:即公钥加密体系(public key cryptography) 四、CA在网络中的工作流程及原理(以网站为例) 五、HTTPS 的工作原理 六、CA私有证…

Android 实战 :DrySister (第一版) — 项目搭建与简单实现

1.一些BB: 入门教程在上一年的11月份就写完了,到现在也有差不多9个多月了, 当时由于自己工作上的一些原因,没有写一个实战的项目,很是遗憾。 最近项目终于也差不多快收尾了,可能会稍微有一些时间&#xff…

矩阵特征值特征向量理解

文章目录 特征值特征向量补充一点关于正交标准化和相似对角化的理解为什么要正交规范化呢?相似对角化为什么要相似对角化捏 特征值特征向量 一些收集到的资料 资料一 迷惑很久,终于想通。 其实是一种数据的处理方法,可以简化数据。矩阵乘特征…

Hugging News #0821: Hugging Face 完成 2.35 亿美元 D 轮融资

每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

uniapp 微信小程序webview 踩坑

uniapp 微信小程序的存在许多功能上的限制和约束,有些情况不得不去使用webview进行开发实现需求,比如 原生无法满足(例如某团队维护SDK 只提供了WEB端jsSDK,且不维护小程序SDK) H5可以同时适用多端(适用范围…

需求分析入门

认识管理软件 什么是管理软件 管理软件就是用来辅助企业进行管理的软件,既包括对企业“人、财、物”相关的资产信息的管理,也包括对企业“供、产、销”相关的业务活动信息的管理。管理软件的重点在于管理信息的收集、流转,资源的共享、集成…

【Redis】Redis 的学习教程(六)Redis 的缓存问题

在服务端中,数据库通常是业务上的瓶颈,为了提高并发量和响应速度,我们通常会采用 Redis 来作为缓存,让尽量多的数据走 Redis 查询,不直接访问数据库。 同时 Redis 在使用过程中(高并发场景下)也…

JavaScript中详解数组的算法

在 JavaScript 中,数组是一种常见的数据结构,它可以存储多个元素,并且可以通过索引来访问和修改这些元素。数组算法是对数组进行各种操作和处理的方法和技巧。下面是一些常见的数组算法: 遍历数组:可以使用 for 循环、…

谁爱待在Android谁待,再也卷不动了

在当前经济环境下,Android开发行业确实面临着竞争激烈、岗位减少的困境。因此,寻求具有更多岗位和良好市场前景的开发方向变得尤为重要。在此背景下,音视频开发和车载开发无疑是两个值得关注的领域。 音视频开发的前景 互联网和智能手机的普…

每日一题——旋转图像

旋转图像 题目链接 方法一:利用辅助数组 通过对示例的观察和分析,我们可以得到这样的结论: 对于原数组的下标为i行元素,顺时针旋转九十度后,都变成了下标为(n-1-i)列元素。如图所示&#xff…

代理模式 静态代理和动态代理(jdk、cglib)——Java入职第十一天

一、代理模式 一个类代表另一个类去完成扩展功能,在主体类的基础上,新增一个代理类,扩展主体类功能,不影响主体,完成额外功能。比如买车票,可以去代理点买,不用去火车站,主要包括静态代理和动态代理两种模式。 代理类中包含了主体类 二、静态代理 无法根据业务扩展,…

蜜桃星球 | 主理人,轻创业翻身副业,情趣赛道行业陪跑服务

我们为什么能在年纪轻轻的时候赚到钱? 一个重要原因就是,接触互联网后,我们所进入的所有行业,都是轻资产领域。 从流量到运营,所有的行业都是轻资产行业,都是不需要囤货的生意,只需要一根网线…

代替forever下一个部署node的持久化工具---pm2

最近有个后端项目,用的是node,在持久化的时候会挂掉,详细了解到用的是nohup,然后先详细了解了一下nohup nohup是一个Linux命令,用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行1nohup的英文全称…

react学习之路:InputNumber的parser在ts里面报类型错误

错误提示&#xff1a; Type ‘(value: string | undefined) > string’ is not assignable to type ‘(displayValue: string | undefined) > 0 | 2 | 20’. Type ‘string’ is not assignable to type ‘0 | 2 | 20’. 代码示例&#xff1a; <InputNumbermin{0}m…

电视盒子哪款好?数码党私藏网络电视盒子排行榜

电视盒子称得上是家家户户必备了&#xff0c;但是不同品牌和不同产品之间的体验差异较大&#xff0c;让大家在挑选电视盒子时都会纠结电视盒子哪款好&#xff0c;我身为资深数码粉&#xff0c;接下来将给各位分享数码粉心中最值得入手的网络电视盒子排行榜&#xff0c;看看电视…

关于xml中返回string类型代码中用list接收的问题,扫描

1.结论,xml中返回为string的话,在list中只会取出来第一个元素 //根据value查询GetMapping("getTest")public List<HashMap> getTest() {List<HashMap> list dictService.getTest();return list;} <select id"getTest" resultType"jav…

伦敦银交易时间怎么选择?

伦敦银和伦敦金都是全球性的交易品种&#xff0c;一般的现货贵金属交易平台&#xff0c;都可以同时经营这两个品种&#xff0c;而且它们的交易时间是一致的&#xff0c;以香港市场的平台为例&#xff0c;基本上交易时间都会从北京周一的早上7点&#xff0c;延续到周六凌晨5点左…