方法一:
# 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