题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
分析:在后序遍历序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:第一部分是左子树节点的值,它们都比根节点的值小;第二部分是右子树节点的值,它们都比根节点的值大。
思路:所以先取数组中最后一个数,作为根节点。然后从数组开始计数比根节点小的数,并将这些记作左子树,然后判断后序的树是否比根节点大,如果有的点不满足,则跳出,并判断为不成立。全满足的话,依次对左子树和右子树递归判断。
代码及注释如下:
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
//空序列应该false
if(sequence==null||sequence.length<=0) return false;
//主程序负责初始特殊情况判断和驱动
return verifySquenceOfBST(sequence,0,sequence.length-1);
}
private boolean verifySquenceOfBST(int[] sequence,int start,int end){
//如果前面分区的时候没有false,那么递归到最后应该都是一个值,去尾两分为空,这时是true
if(start>=end) return true;
int root=sequence[end];
//用i找到小大数值分隔点
int i=start;
while(sequence[i]<root){
i++;
}
//如果i之后还有比根节点小的,那就false
int j=i;
while(j<end){
if(sequence[j]<root){
return false;
}
j++;
}
//除根节点之外两侧递归
boolean left=verifySquenceOfBST(sequence,start,i-1);
boolean right=verifySquenceOfBST(sequence,i,end-1);
return left&&right;
}
}