二叉树展开为链表
给你二叉树的根结点 root ,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
- 展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 1:
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [0]
输出:[0]
思路:
可以知道对于任何一种二叉树,最终都会变成“从左上到右下斜着的一条”。我们从最简单的图开始,假设就对于这张图:的左子树:一个三个节点的二叉树,根节点2,左子节点3,右子节点4。我们按照前序遍历的顺序打平成链表,就会得到2->3->4,这个时候,我们发现,根节点的左子树和右子树都被“打平”了。然后我们只需要把左边的打平序列插到右边打平序列上面即可。
而我们打平左子树的操作,其实也就是把左子树的3插入到了右子树的4上面了——只不过这一步“打平”操作的对象全都是节点,算是最里的一层base case。
所以从里到外一直就是这么个过程,可以发现这就是一个递归写法。
代码:
class Solution(object):
def flatten(self, root):
if not root:#base case
return
#先打平左右两边
self.flatten(root.left)#先打平左边
self.flatten(root.right)#再打平右边
#再按想法操作 如何嫁接
temp = root.right#先把右边取出来暂存着
root.right=root.left#把左子树放在根节点的右子树位置
root.left=None#左子树位置空
while root.right:#找到新右子树的末尾节点
root=root.right
root.right=temp#新右子树的末尾节点指向原右子树
总结:
在整棵树的最外层,我们要做的就是先把左子树打平,再把右子树打平,然后把打平的左子树移动到根节点和右子树之间。至于左右子树的具体打平方式就继续交给递归。单从最外层就实现了整个功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了