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

发布了122 篇原创文章 · 获赞 415 · 访问量 55万+

猜你喜欢

转载自blog.csdn.net/m0_37870649/article/details/103916072