1,問題的描述
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
2,解題思路
二叉樹後序遍歷序列的最後一個值是根節點的值,二叉搜索樹後序遍歷序列的合法性條件是:先根據根節點的值將後序遍歷序列分爲左右兩個序列,左邊序列所有元素應該都小於根節點的值,右邊序列所有元素應該都大於根節點的值。左右兩個序列同樣應該是二叉搜索樹的合法後序遍歷序列,那麼就用遞歸的方法去判斷就行了。注:一定要注意遞歸的出口,在源碼中有註釋。
3,源碼
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0) return false;//正常情況下空樹是二叉搜索樹,但是此題認定空樹不是二叉搜索樹
return judge(sequence,0,sequence.length-1);
}
public boolean judge(int[] sequence, int l, int r) {
if(l>=r) return true;//l>r表示空樹,l==r表示葉子節點
int i=r;
while(i>l && sequence[i-1]>sequence[r]) i--;//i的最終值是右序列的起始位置
//for循環判斷左序列是否包含大於根節點值的節點,若有,說明不滿足二叉查找樹的合法性。
for(int j=l;j<i-1;j++) {
if(sequence[j]>sequence[r]) return false;
}
return judge(sequence,l,i-1)&&judge(sequence,i,r-1);
}
}