题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
分析
碰到二叉树,优先想递归。
这里,后序数组,最后一个是根节点;从数组开始到第一个比root大的元素前面属于左子树;后面属于右子树;可以检查右子树是否都比root大。否,直接返回false;是,递归调用判断函数;
这里,终结条件是数组比较的开始位置大于或等于结束位置。假如跑到这一步,说明前面递归都没返回false。即,满足搜索二叉树,返回True。
代码实现
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence == null || sequence.length == 0){ //边界条件
return false;
}
if(sequence.length == 1){ //边界条件
return true;
}
return judge(sequence, 0, sequence.length - 1);
}
public boolean judge(int[] m, int start, int end){ //判断递归函数,三个参数
if(start >= end){ // 终结条件
return true;
}
int root = m[end];
int i = start;
for(; i < end; i++){ //找到左子树的结尾节点
if(m[i] > root){
break;
}
}
for(int j = i; j < end; j++){ //判断右子树是否符合搜索二叉树,即右子树都比root大
if(m[j] <= root){
return false;
}
}
return judge(m,start,i-1) && judge(m,i,end-1); // 递归左右两棵子树
}
}