二叉搜尋樹的中序遍歷就是遞增序列,所以我們只要找到被替換樹的中序過程中違反遞增規律的節點就可以了。
替換後 有兩種情況:
1,[1,3,2,4]
2, [4,2,3,1]
第一種情況 替換3和2的值。
第二種情況 替換4和1的值。
在中序遍歷樹的過程中,只要我們發現逆序數對並且用兩個值x,y記錄逆序數對的兩個值。
在第一種情況下 x,y被同時賦值。
在第二種情況下,先記錄x=4,後記錄y=1。
最後替換x,y的值,完成恢復。
class
solution
(object):
defrecovertree
(self, root)
:"""
:type root: treenode
:rtype: none do not return anything, modify root in-place instead.
"""x,y =
none
,none
stack =
pre =
none
while root or stack:
while root:
root = root.left
if stack:
t = stack.pop(-1
)if pre and pre.val > t.val:
y = t
ifnot x:
x = pre
else
:break
pre = t
root = t.right
x.val,y.val = y.val,x.val
Leetcode 99 恢復二叉樹
題目描述 題解 找規律,題目限制了只交換兩個節點,那麼在中序遍歷的時候,用pre存中序遍歷的前乙個節點,如果當前節點 記為now 的值小於pre的值,那麼now,pre中有乙個是需要交換的節點。我們注意到,第一次出現上述情況的pre為需要交換的第乙個節點,第二次出現上述情況的now節點為需要交換的第...
leetcode 99 恢復二叉搜尋樹(二叉樹)
二叉搜尋樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。示例 1 輸入 1,3,null,null,2 1 3 2 輸出 3,1,null,null,2 3 1 2 示例 2 輸入 3,1,4,null,null,2 3 1 4 2輸出 2,1,4,null,null,3 2 1 ...
Leetcode99 恢復二叉搜尋樹
第一次寫這個部落格以後我發現我理解錯了題目,但是我的問題更具有一般性,更複雜,所以文章就不改了 題目 只有兩個結點被錯誤的交換。我的 有任意多個結點被錯誤的交換。先分析題目 使用o n 空間複雜度的解法很容易實現,那麼我們先看看很容易實現是怎實現的。1 中序遍歷二叉樹,並將中序序列儲存在乙個陣列nu...