題目描述
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的后序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
代碼實現
import java.util.Arrays;
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence == null || sequence.length == 0)
return false;
int root = sequence[sequence.length-1];
//在二叉搜索樹中左子樹的結點小于根結點
int i = 0;
for(;i < sequence.length-1;i++){
if(sequence[i] > root)
break;
}
//在二叉搜索樹中右子樹的結點大于根結點
int j = i;
for(;j < sequence.length-1;j++){
if(sequence[j] < root)
return false;
}
//判斷左子樹是不是二叉搜索樹
boolean left = true;
if(i > 0){
left = VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, i));
}
//判斷右子樹是不是二叉搜索樹
boolean right = true;
if(i < sequence.length-1){
right = VerifySquenceOfBST(Arrays.copyOfRange(sequence, i, sequence.length-1));
}
return left && right;
}
}
主要思路
1、二叉查找樹,又叫二叉排序樹,它或者是一棵空樹,或者是具有下列性質的: 若它的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值;它的左、右子樹也分別為二叉排序樹
2、后序遍歷序列的最后一個結點為根結點,數組中前面的數字分為兩部分:前半部分是左子樹結點的值,它們都比根結點小,后半部分是右子樹結點的值,它們都比根結點大
3、截取數組的一部分用 Arrays.copyOfRange(sequence, 0, i)