1.最後乙個節點為根節點
2.左邊的節點全部要小於根,右邊的節點全部要大於根,因此陣列可以分成兩個區間,前半部分全部小於根,後半部分全部大於根
3.找到兩個區間的分割點,判斷是否兩個區間是否符合該性質
1時間複雜度 o(n^2): 每次遞迴呼叫都減去乙個根節點,因此遞迴占用 o(n) ;最差情況下(即當樹退化為鍊錶),每輪遞迴都需遍歷樹所有節點,占用 o(n) 。class
solution 78
return check(postorder, 0, postorder.size()-1);9
}101112
bool check(vector& postorder, int l, int
r) 23}24
25/*
右子樹大於根節點的值
*/26
for(int j = i+1; j < r; ++j)
3031
//遞迴檢查左右子樹是否滿足二叉搜尋樹的性質
32return check(postorder, l, i-1) && check(postorder, i, r-1
);33
}34 };
空間複雜度 o(n) : 最差情況下(即當樹退化為鍊錶),遞迴深度將達到 n 。
面試題33. 二叉搜尋樹的後序遍歷序列(遞迴分治 / 單調棧,清晰**)
遞迴和棧兩種方式解決,最好的擊敗了100%的使用者
劍指offer 33 二叉搜尋樹的後序遍歷
題目描述 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。思路 遞迴。最後乙個數字是樹的根節點,第一部分是左子樹節點的值,都比根節點小。第二部分是右子樹節點的值,都比根節點大。class solution de...
劍指Offer 33 二叉搜尋樹的後序遍歷
由於是後序遍歷,所以陣列最後乙個元素是根節點 遞迴開始傳入起始元素 和 末尾元素 當起始索引 left right 結束遞迴 執行迴圈,找到第乙個比根節點大的元素 temp 它的左面是樹的左子樹,右面到根節之間是樹的右子樹 判斷temp 到 root 之間的結點是否全部大於根節點 進行下一次遞迴,直...
劍指offer 33 二叉樹映象
操作給定的二叉樹,將其變換為源二叉樹的映象。二叉樹的映象定義 源二叉樹 8 6 10 5 7 9 11 映象二叉樹 8 10 6 11 9 7 5 複製 首先先理解題意,映象通過以下幾個步驟可以實現 可以看到首先對根節點的左右進行翻轉。再遞迴的對左子樹,以及右子樹進行翻轉。之前講過,鍊錶的題目分為四...