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

發佈了117 篇原創文章 · 獲贊 415 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章