题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd
解题想法
分治递归思想:序列最后一个元素是根节点,而二叉搜索树的根节点左边的序列值比根小,右边的比根大。
根据这个特性,将序列分为两半,左边序列的值比根节点小,右边序列的值比根节点大。如果序列出现不满足上述要求的,说明不是后序遍历序列。
代码实现
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
// 异常条件
if (sequence == null || sequence.length == 0){
return false;
}
return func(sequence,0,sequence.length-1);
}
public boolean func(int [] a,int start,int end){
// 递归弹出条件
if (start >= end){
return true;
}
int i = start;
// 先找到序列的分界点
for ( ; i<end; i++){
if (a[i] > a[end]){
break;
}
}
// 分界点右边的序列应该比根节点大,否则返回false
for (int j = i;j<end;j++){
if (a[j] < a[end]){
return false;
}
}
//
return func(a,start,i-1) && func(a,i+1,end);
}
}