每日題。又是二分搜尋樹,follow up還要求O(1)空間解法,結果人有爆氣說沒必要反芻五十年前的垃圾演算法,有夠好笑。

題目

輸入一個錯誤的二元搜尋樹,其中有正好2個節點互相被換了位置。在不改變樹的結構下,將節點值恢復到正確的位置。

解法

先遍歷一次樹,取出所有節點值後排序。以中序遍歷再走一次樹,把節點值依序放回正確的位置上即可。

class Solution:
    def recoverTree(self, root: Optional[TreeNode]) -> None:
        
        nodes=[]
        
        def get(node):
            if not node:
                return 
            get(node.left)
            nodes.append(node.val)
            get(node.right)
        
        get(root)
        nodes.sort(reverse=1)
        
        def put(node):
            if not node:
                return 
            put(node.left)
            node.val=nodes.pop()
            put(node.right)
            
        put(root)