剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)

时间:2023-03-10 02:26:54
剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)

问题描述:

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回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); }