題目:輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
解析:二叉搜索樹爲二叉樹左節點小於根節點,右節點大於根節點;
①[5, 7, 6, 9, 11, 10, 8]數組中最後一位元素8爲二叉搜索樹的根節點,從後往前找到所有連續比根節點8大的數即爲根節點8的右子樹,記錄此時的位置索引index;
②如果該數組是二叉搜索樹的後序遍歷結果,則index之前的所有數組元素均比根節點8大;
③如果步驟①②中均成立,則再次比較0-(index-1)中的數組和index-(arr.length-2)中的數組是否同樣滿足二叉搜索樹的性質,只要其中有一個未能滿足就return NO。
public boolean VerifySquenceOfBST(int [] sequence) {
if (sequence.length == 0) return false;
boolean ret = ispostOrder(sequence,0,sequence.length-1);
return ret;
}
public boolean ispostOrder(int[] sequence,int startidx,int endidx){
if (startidx>=endidx) return true;
int i = endidx;//序列的最後一個爲根節點
//從序列的後面往前遍歷,直到找到比根節點小的位置
while (i>startidx&&sequence[i-1]>sequence[endidx]){
--i;
}
//此時i-1位置序列元素小於sequence[endidx]
for (int k = i-1; k>=startidx; k--){
if (sequence[k]>sequence[endidx])
return false;
}
//繼續判斷根節點的左子樹和右子樹是否同樣滿足二叉搜索樹的性質
return ispostOrder(sequence,startidx,i-1)&&ispostOrder(sequence,i,endidx-1);
}