difficulty:困難
給你二叉搜尋樹的根節點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 使二叉搜尋樹有效。
solution
language:全部題目
對樹做一次中序遍歷就能找到兩個位置不正確的兩個節點,解法參考:python easy to understand solutions - leetcode discuss
# 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):
pre = first = second = none
stack =
while true:
while root:
root = root.left
if not stack:
break
node = stack.pop()
if not first and pre and pre.val > node.val: # 當第乙個節點first找到之後這個if條件便不再滿足了
first = pre
if first and pre and pre.val > node.val:
second = node
pre = node
root = node.right
first.val, second.val = second.val, first.val
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...