
題目出處:https://leetcode.com/problems/flatten-binary-tree-to-linked-list/
更改二叉樹構造,使左邊沒有子樹。原本左邊的子樹接至右邊。右邊的子樹接至左邊尾端。
我覺得有點困難,為此有查了些資料。主要就是因為樹有改變。
左右回傳的目的又不相同。一開始我就只是判斷左子樹回傳None就不做更改。
解果就是遞歸跑回上層時。左邊節點會在下一層。而非最底層。
已Example 1來說執行順序會是
左左『左右』(底)右左(無)右『左右』(底)(回傳4)...。
我是把他想像成他有個路徑,要依序執行。這裡我有想段時間。
還是有人有更容易懂的想法歡迎提出來討論。
我只覺得可以自己想到怎麼解的人很強。我可能不適合做這行吧。
期待自己也有放下鍵盤的一天。困難的問題還是留給天才吧。
#python3 代碼:
# 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 move_tree(self, root):
# 回傳None判斷是否為最後的節點
if not root:
return None
# 取左節點來判斷是否要執行更改二叉樹
left_tree = self.move_tree(root.left)
# 在這裡右節點跟左節點得功能不太相同,是抓右邊最尾端
right_tree = self.move_tree(root.right)
# 如果左邊有子樹就不符合題意所以一旦有左子樹就要修改其結構
if left_tree:
# 先把右子樹接到回傳左子樹右端
left_tree.right = root.right
# 複製以排序的子樹
root.right = root.left
# 清空左子樹
root.left = None
# 這行return最難。是為了抓右節點所以才寫成這樣
# 如果右端有直就優先回傳右端為了抓該層最右下的值
return right_tree or left_tree or root
def flatten(self, root: Optional[TreeNode]) -> None:
"""
Do not return anything, modify root in-place instead.
"""
self.move_tree(root)
以上。如有問題歡迎討論指教。