题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。
1、确定root;
2、从后边遍历序列(除去root结点),找到第一个小于root的位置,则该位置左边为左子树,右边为右子树;
3、遍历左子树,若发现有大于root的值,则直接返回false;
4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。
代码
public class Main {
public boolean VerifySquenceOfBST(int [] sequence) {
int len=sequence.length;
if(len==0) return false;
if(len==1) return true;
return judge(sequence,0,len-1);
}
public boolean judge(int [] sequence,int start,int end){
if(start>end) return true;
int root;
root=sequence[end];
int i=0;
int mid=0;
for(i=end;i>=0;i--){
if(sequence[i]<root) break;
}
mid=i;
//因为mid之后的数值已经比较过了,肯定比root大,所以只需比较mid前边的数字是否比root小
for(;mid>=0;mid--){
if(sequence[mid]>root)
return false;
}
return judge(sequence,0,mid)&&judge(sequence,mid+1,end-1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Main m=new Main();
int []sequence={7,4,6,5};
boolean temp=m.VerifySquenceOfBST(sequence);
System.out.println(temp);
}
}