99. 恢復二叉搜尋樹
一開始想了好久沒有什麼好思路,去網上搜了一下,原來是中序遍歷。二叉搜尋樹的中序遍歷是個(遞增)有序數列,利用這個特性,我們可以很巧妙的解決這個題。
先看第二個例子,中序遍歷後是:13245,觀察發現只有一處發生了降序,只在第二位與第三位發生了降序情況,說明這兩個數為異常數,交換3和2的位置重新中序遍歷:12345
第乙個例子,中序遍歷是:321,觀察發現有兩處發生了降序,第一到第二位,以及第二到第三位,這種情況下交換第一位與第三位即可
實際上題目中只有兩個節點被交換了,所以降序情況最多也只會出現兩處。所以分兩種情況處理即可。
我們再造個例子,看的更直觀點:
[10 17 15 1 8 12 5]
中序遍歷
1 17 8 10 12 15 5
17與3發生了降序,15與5發生了降序,我們將第乙個降序的前乙個元素與第二個降序的後乙個元素,進行交換即可。
當只有一次降序出現時(可以理解為兩個降序擠到了一塊嘛),降序的前乙個元素與降序的後乙個元素,進行交換即可。
**
class solution
last = root;
middle(root.right);
}public void recovertree(treenode 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...