題目描述
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出true,否則輸出false。假設輸入的陣列的任意兩個數字都互不相同。
思路:
容易想到的是還原這客二叉樹,再根據root節點和左右子樹的關係來判定是否為二叉搜尋樹。但只有後序遍歷是無法還原這棵樹的。
因此只能根據二叉樹的定義來判定:
所以思路為:root.left
.val
< root.val
< root.right
.val
root.left為二叉搜尋樹 && root.right為二叉搜尋樹
1. 針對陣列arr[start~end],把arr[end]當做root節點,遍歷找到左右子樹的分界線
arr[i-1]arr[end];
2. 需要注意的是,arr陣列start~(i-1)之間的數小於arr[end],arr陣列i~(end-1)之間的數大於arr[end],否則return false;
3. 把左右子樹arr[start~(i-1)]和arr[i~(end-1)]分別考察是否為二叉搜尋樹
4. 最壞情形:該二叉搜尋樹所有節點只有左節點(或只有右節點),此時時間複雜度為o(n^2)。最好情形:該二叉搜尋樹所有葉子節點高度一致,此時時間複雜度為o(nlogn)。空間複雜度為o(1)
**如下:
輸出結果:/**
*@author mengjun li
*@create 2017/10/3
*@since 1.0.0
*/public
class
main ;//這是乙個二叉搜尋樹的後序遍歷
int arr1 = ;//這是乙個二叉搜尋樹的後序遍歷
system.out.println(isbst(arr));
system.out.println(isbst(arr1));
}public
static
boolean
isbst(int arr)
public
static
boolean
isbstcore(int arr, int start, int end)
true
false
二叉搜尋樹的後序遍歷序列
題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是返回true,否則返回false。假設輸入的陣列的任意兩個數字都不相同。解答 二叉搜尋樹後序遍歷最後訪問的是根節點,根據根節點將陣列分成兩部分,前面一部分即左子樹值小於根節點值,後面一部分即右子樹的值大於根節點 再遞迴的檢查...
二叉搜尋樹的後序遍歷序列
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。include using namespace std bool verifysquenceofbst int sequence,int length int j...
二叉搜尋樹的後序遍歷序列
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。class solution 在二叉搜尋樹中右子樹的結點大於根結點 int j i for j0 left verifysquenceofbst lefttree...