LeetCode 114

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
            

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章