二叉树展开为链表

114. 二叉树展开为链表

给你二叉树的根结点 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#新右子树的末尾节点指向原右子树

总结:

  在整棵树的最外层,我们要做的就是先把左子树打平,再把右子树打平,然后把打平的左子树移动到根节点和右子树之间。至于左右子树的具体打平方式就继续交给递归。单从最外层就实现了整个功能。

posted @   JunanP  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示