問題描述:
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的數組的任意兩個數字都互不相同。
思路:
1.首先後序遍歷的結果是[(左子樹的後序)(右子樹的後序)根結點],那麼我們首先找到了根結點的值,
2.其次,我們知道二叉搜索樹的性質是:任何結點的左子樹的值小於根結點的值,小於右子樹的值。
3.因此,從後向前遍歷,找到第一個小於root.val的,下標爲index, 若index == n-1(n爲數組的長度),則顯然不滿足,返回false, 否則我們可以將數組劃分出來[(左子樹的後序)(右子樹的後序)根結點]。
4.最後對左右子樹遞歸的判斷即可。(但是這裏要注意左子樹或右子樹爲空的情況)
代碼:
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence == null || sequence.length == 0){
return false;
}
int n = sequence.length;
if(n == 1 || n == 2){
return true;
}
int index = -1;
for(int i = n-2; i >= 0; i--){
if(sequence[i] < sequence[n-1]){
index = i;
break;
}
}
int[] left = new int[index+1];
int[] right = new int[n-2-index];
for(int i = 0; i <= index; i++){
if(sequence[i] > sequence[n-1]){
return false;
}
left[i] = sequence[i];
}
for(int i = index+1; i< n-1; i++){
right[i-index-1] = sequence[i];
}
if(index == n - 2 && left.length != 0){
return VerifySquenceOfBST(left);
}
if(left.length == 0){
return VerifySquenceOfBST(right);
}
if(right.length == 0){
return VerifySquenceOfBST(left);
}
return VerifySquenceOfBST(left) && VerifySquenceOfBST(right);
}