剑指offer(牛客)---26.二叉搜索树与双向链表

news/2025/1/15 13:05:44/

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

 

/**
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}}
*/
public class Solution {public TreeNode Convert(TreeNode pRootOfTree) {if(pRootOfTree==null)return null;if(pRootOfTree.left==null&&pRootOfTree.right==null)return pRootOfTree;// 1.将左子树构造成双链表,并返回链表头节点TreeNode left = Convert(pRootOfTree.left);TreeNode p = left;// 2.定位至左子树双链表最后一个节点while(p!=null&&p.right!=null){p = p.right;}// 3.如果左子树链表不为空的话,将当前root追加到左子树链表if(left!=null){p.right = pRootOfTree;pRootOfTree.left = p;}// 4.将右子树构造成双链表,并返回链表头节点TreeNode right = Convert(pRootOfTree.right);// 5.如果右子树链表不为空的话,将该链表追加到root节点之后if(right!=null){right.left = pRootOfTree;pRootOfTree.right = right;}return left!=null?left:pRootOfTree;  }
}

遇到递归,就需要举例进行分析,不然你根本看不到递归在干嘛!

假设有如下一棵二叉搜索树:

 

 

 执行下面这段代码:

一直到节点1停止,当前left=节点1:

因为节点1没有右孩子,所以继续往下:

将p的父节点pRootOfTree,加到p的右节点, 将p放到pRootOfTree左结点,这样就形成了双向链表;

当前双向链表的结构:

继续往下

 节点6进入递归:

来到当前位置:

节点6的左孩子节点4进入递归:

因为节点4没有左右孩子,返回节点4,left=节点4,由于节点4没有右孩子,执行到:

将p的父节点pRootOfTree加到p的右孩子上面,将p 加到pRootOfTree的左孩子上面;

结构如下图所示:

继续往下:

将pRootOfTree节点(6)的右孩子放入到递归中:

 节点7没有左右孩子,直接返回节点7,right=节点7;

这样的话,就可以直接将节点7加入到双向链表中:

结构如下图所示:

继续往下

左结点left是4哦,这样别忘了,然后返回:

当前位置是left=1,pRootOfTree=3,(递归是真的有意思) ,到一下

将right加入链表中之后,的结构:

 然后返回:

 

后面的代码我就我具体分析了,后面基本上就是将根结点加入到该左孩子链表的尾部,然后一样的方式去递归右孩子双向链表,把根结点放到链表头就可以了;

总结:递归是二叉树问题的核心,递归写起来简单,理解起来难,而且要一步步讲出来的话,越描述到下面,越难描述,所以后面我就没有继续描述了,因为递归中的一步步回归是真的麻烦.

永远要记住:不积跬步无以至千里!


http://www.ppmy.cn/news/713842.html

相关文章

SPOJ BALNUM Balanced Numbers 入门数位dp

https://www.spoj.com/problems/BALNUM/en/ 题意:如果一个数每个位上的奇数出现偶数次, 偶数出现奇数次, 那这个数是好数, 问区间内有多少个好数 思路: 数位dp 开203*102共12维空间, 20是数长度, 3*10表示0-9每个数出现的情况,0表示没出现过, 1表示出现奇数次, 2表示出现偶数…

腾讯最大规模裁撤中层干部,让贤年轻人

近日,据媒体报道,自2018年12月以来,腾讯已开始裁撤一批中层干部,调整比例为10%,这样的规模“是腾讯历时上绝无仅有的”,一位腾讯内部员工称。此轮调整被视为腾讯第三次架构调整的继续,腾讯并未公…

探索思维导图:提升思维能力与效率的利器

思维导图作为一种强大的思考工具,已经被广泛应用于各个领域,从学习、工作到创意思维和项目管理。 本文将为您介绍思维导图的基本概念、使用方法以及它对思维能力和效率提升的价值。通过学习和掌握思维导图,您将能够更系统地组织和表达您的思…

Linux-CentOS/统信UOS(v20-1060a/e)安装.net core 6.0运行环境

打开终端,输入以下指令,将Microsoft包的签名密钥添加到受信任密钥列表,同时添加Microsoft包存储库 //如果是管理员账号 例如 root 登录的系统,那么前面的sudo可以省略 sudo rpm -Uvh https://packages.microsoft.com/config/cent…

《王者荣耀》新英雄金蝉携86版西游记联动皮肤登场,你期待吗?

自东土而来,往西途而去;以前梦为引,向信念而行。 今天上午,王者荣耀 官微正式发文宣布,《王者荣耀》新英雄金蝉即将上线,其原型就是四大名著《西游记》中最重要的人物之一唐僧。 在《西游记》原著的设计中…

手机自动化测试之图像识别——刷王者荣耀金币

其实可以更简单实现刷金币的过程,可以参考:实现用python刷王者荣耀金币。这里使用图像识别进行刷取,更加稳定,但是也更复杂,这里主要是提供一个图像识别应用的思路。 一、关卡选取   王者荣耀的冒险模式里有个挑战模…

android vulkan 游戏,王者荣耀Vulkan版

王者荣耀Vulkan版是腾讯针对高配置的手机,启动高清流畅的游戏画质。让玩家体验的到超清画质的游戏体验,想要体验的玩家赶紧来下载王者荣耀Vulkan版。 官方介绍 自设计之初,Vulkan就充分考虑到移动平台多核CPU和GPU协同处理任务的特点。通过让…

王者转区显示服务器列表错误,王者荣耀转区功能-王者转区服务-王者转移号-王者转服...

原标题:王者荣耀转区功能-王者转区服务-王者转移号-王者转服 王者荣耀上线“转区”功能!花99块! 舍不得王者账号里的数据? iPhone用户放弃自己努力几年的“心血”,转投安卓阵营从零开始? 恭喜这些天天活跃在王者峡谷里的召唤师们!…