114. Flatten Binary Tree to Linked List
114. Flatten Binary Tree to Linked List
這一是後續遍歷很經典的一道題目,體現了後續遍歷很重要的一個精神,當後續遍歷到一半,我們當下處在的位置,表示前面的遍歷都已經完成我們想要完成的事情了。
這一題如果用直覺來想,也會想到我們一定是要先把子樹給處理完,再慢慢往根節點走,然後我們也是先從左子樹處理,再往右子樹處理,當遞迴走下去的同時,我們回傳的樹最後的位置就可以了,因為我們當下的節點的左右節點,都是左子樹和右子樹的根節點。
這個題目當中,我們要把所有的扁平化都放到右子樹,有兩種情況要考慮,所以如果說當下的節點,只有右子樹,那我們就把右子樹的葉節點回傳回去就好,如果說左邊的節點有一個子樹,我們就要先把左邊子樹的「最後一個節點」,先指向右邊子樹的「根節點」,再來是我要把我指向右邊子樹的根節點改成指向左邊子樹的根節點,最後我要把指向左邊子樹的指向,改成指向空節點。這時候我們就完成了這一層的壓平。
最後,我們再判斷,左子樹或是右子樹存不存在,如果存在右邊,就返回右邊的葉節點,不存在才返回左側子樹的葉節點。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def flatten(self, root: Optional[TreeNode]) -> None:
"""
Do not return anything, modify root in-place instead.
"""
def traverse(root):
if not root or not root.left and not root.right:
return root
left = traverse(root.left)
right = traverse(root.right)
if left:
left.right = root.right
root.right = root.left
root.left = None
return right if right else left
traverse(root)