LeetCode 114.二叉树展开为链表(Python实现)

方法一:

    # def preOrderTravel(self,root,listnode):
    #     if not root:
    #         return None
    #     listnode.append(root.val)
    #     self.preOrderTravel(root.left,listnode)
    #     self.preOrderTravel(root.right,listnode)

        

    # def flatten(self, root: TreeNode) -> None:
    #     """
    #     Do not return anything, modify root in-place instead.
    #     """
    #     listnode=[]
    #     self.preOrderTravel(root,listnode)
    #     pnode=root
    #     for i in range(1,len(listnode)):
    #         pnode.left=None
    #         pnode.right=TreeNode(listnode[i])
    #         pnode=pnode.right
    #     return root

方法二:

    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        # 鲁棒性
        if not root:
            return None
        # 递归(后序遍历)
        self.flatten(root.left)
        self.flatten(root.right)
        if root.left:
        	#左树接右位
            right = root.right
            root.right = root.left
            root.left = None
            #右树接最后
            while root.right:
                root = root.right
            root.right = right

有小伙伴可能又要问了,为什么不直接像以下这样操作呢?

        if root.left:
            temp = root.right
            root.right = root.left
            root.left = None
            root.right.right = temp

这不是刚好原来的右树接到原来左树后吗?我一开始写的时候也犯了这个错误,让我们来结合图示看一下。

在这里插入图片描述

第一次递归回去,好像是对的。

在这里插入图片描述

但第二次递归回去就明显不对了,这是因为我们将原来的右树直接接在原来的左树上,丢失了3和4节点。因此,我们要在这里加一个while循环,确保接到最后面的节点,即本题的节点4,这样才正确。

参考:https://blog.csdn.net/qq_39315740/article/details/89004628

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值