題目描述
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
什麼是二叉搜索樹:
根節點的值大於其左子樹中任意一個節點的值,小於其右節點中任意一節點的值,這一規則適用於二叉查找樹中的每一個節點。
本文章重點來討論一下關於二叉查找樹刪除節點的問題。
二叉搜索樹上的基本操作所花費的時間與這棵樹的高度成正比。對於有n個結點的一棵完全二叉樹來說,這些操作的最壞運行時間爲Θ(lgn)。然而,如果這棵樹是一條n個結點組成的線性鏈,那麼同樣的操作就要花費Θ(n)的最壞運行時間。當然,我們可以通過隨即構造一棵二叉搜索樹的期望高度爲O(nlgn),因此這樣一棵的動態集合的基本操作的平均運行時間是Θ(lgn)。
class Solution {
bool judge(vector<int>& s,int l,int r){
if(l>=r)//遍歷完成 說明符合BST定義
return true;
int i=r;
while( i > l&& s[i-1] > s[r])//確定右子樹的範圍 s[r]爲根節點的值
i--;
for(int j=i-1;j>=l;j--)//確定左子樹是否符合BST定義
if(s[j]>s[r])
return false;
return judge(s,l,i-1)&&judge(s,i,r-1);//遞歸確定左右子樹
}
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int len = sequence.size();
if(len == 0)//爲空樹
return false;
return judge(sequence , 0 , len-1 );//判斷是否爲BST
}
};