题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
分析:在后序遍历序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:第一部分是左子树节点的值,它们都比根节点的值小;第二部分是右子树节点的值,它们都比根节点的值大。
所以先取数组中最后一个数,作为根节点。然后从数组开始计数比根节点小的数,并将这些记作左子树,然后判断后序的树是否比根节点大,如果有点不满足,则跳出,并判断为不成立。全满足的话,依次对左子树和右子树递归判断。
代码:
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence==null||sequence.length<=0) return false;
return verifySquenceOfBST(sequence,0,sequence.length-1);
}
private boolean verifySquenceOfBST(int[] sequence,int start,int end){
if(start>=end) return true;
int root=sequence[end];
int i=start;
while(sequence[i]<root){
i++;
}
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;
}
}