mark,好題目! 題目要求將一個二叉樹按照前序遍歷的方式展開成一個新樹,要求就在此棵樹上面進行修改,也就是不能佔用額外的空間。遞歸是直觀的解法,但是會佔用額外的存儲空間,因爲每一層遞歸都會保留左右子樹相關的信息,空間複雜度不是常數。
可以發現,右子樹的所有節點都一定在左子樹最右邊節點的後面!所以該題的核心關鍵所在就是每次找到左子樹中最右邊的那個節點,將整個右子樹放到該節點的右邊。然後再把左子樹放入到原先的右子樹上,設置左子樹爲None,然後再從root更新到右子樹,如圖所示:
代碼如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def flatten(self, root):
"""
:type root: TreeNode
:rtype: None Do not return anything, modify root in-place instead.
"""
temp_root = root
while(temp_root!=None):
if temp_root.left !=None:
right_root = temp_root.left
while(right_root.right!=None):
right_root = right_root.right
right_root.right = temp_root.right
temp_root.right = temp_root.left
temp_root.left = None
temp_root = temp_root.right