給你二叉搜尋樹的根節點 root ,該樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。
高階:使用 o(n) 空間複雜度的解法很容易實現。你能想出乙個只使用常數空間的解決方案嗎?
示例 1:
輸入:root = [1,3,null,null,2]
輸出:[3,1,null,null,2]
解釋:3 不能是 1 左孩子,因為 3 > 1 。交換 1 和 3 使二叉搜尋樹有效。
示例 2:
輸入:root = [3,1,4,null,null,2]
輸出:[2,1,4,null,null,3]
解釋:2 不能在 3 的右子樹中,因為 2 < 3 。交換 2 和 3 使二叉搜尋樹有效。
樹上節點的數目在範圍 [2, 1000] 內
-231 <= node.val <= 231 - 1
解題思路:
思路與演算法
方法一是顯式地將中序遍歷的值序列儲存在乙個 nums 陣列中,然後再去尋找被錯誤交換的節點,但我們也可以隱式地在中序遍歷的過程就找到被錯誤交換的節點 x 和 y。
具體來說,由於我們只關心中序遍歷的值序列中每個相鄰的位置的大小關係是否滿足條件,且錯誤交換後最多兩個位置不滿足條件,因此在中序遍歷的過程我們只需要維護當前中序遍歷到的最後乙個節點 pred,然後在遍歷到下乙個節點的時候,看兩個節點的值是否滿足前者小於後者即可,如果不滿足說明找到了乙個交換的節點,且在找到兩次以後就可以終止遍歷。
這樣我們就可以在中序遍歷中直接找到被錯誤交換的兩個節點 x 和 y,不用顯式建立 nums 陣列。
中序遍歷的實現有迭代和遞迴兩種等價的寫法,在本方法中提供迭代實現的寫法。使用迭代實現中序遍歷需要手動維護棧。
python**:
# 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 recovertree(self, root: treenode) -> none:
"""do not return anything, modify root in-place instead.
"""stack =
x = none
y = none
pre = none
while stack or root:
while root:
root = root.left
root = stack.pop()
if pre and pre.val > root.val:
y = root
if not x:
x = pre
pre = root
root = root.right
x.val, y.val = y.val, x.val
return root
Leetcode99 恢復二叉搜尋樹
第一次寫這個部落格以後我發現我理解錯了題目,但是我的問題更具有一般性,更複雜,所以文章就不改了 題目 只有兩個結點被錯誤的交換。我的 有任意多個結點被錯誤的交換。先分析題目 使用o n 空間複雜度的解法很容易實現,那麼我們先看看很容易實現是怎實現的。1 中序遍歷二叉樹,並將中序序列儲存在乙個陣列nu...
LeetCode 99 恢復二叉搜尋樹
3 1 2示例 2 輸入 3,1,4,null,null,2 3 1 4 2 輸出 2,1,4,null,null,3 2 1 4 3 高階 使用 o n 空間複雜度的解法很容易實現。你能想出乙個只使用常數空間的解決方案嗎?1.中序遍歷,儲存陣列 2.排序陣列 3.重新賦值,恢復二叉樹 includ...
LeetCode99 恢復二叉搜尋樹
二叉搜尋樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。樹節點的定義 definition for a binary tree node.public class treenode treenode int val treenode int val,treenode left,tr...