java 二叉搜索树的后续遍历序列

题目

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值