剑指offer——二叉搜索树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

public class verifySquenceOfBST {
	
	public boolean VerifySquenceOfBST(int [] sequence){
		if(sequence.length==0)
			return false;
		return IsTreeBST(sequence,0,sequence.length-1) ;
	}
	
	public boolean IsTreeBST(int [] sequence,int start,int end) {
		if(end<=start)
			return true;  //并不是输入合法的判断条件,而是递归结束条件
		//判断左子树的节点小于根节点,并记下右子树的第一个元素位置,记为i
		int i=start;
		for(;i<end;i++){
			if(sequence[i]>sequence[end]){
				break;
			}
		}
		//判断右子树上的元素是否都满足添加
		for(int j=i;j<end;j++){
			if(sequence[j]<sequence[end])
				return false;
		}
		//判断左子树和右子树是否是二叉搜索树
		return IsTreeBST(sequence,start,i-1)&&IsTreeBST(sequence,i,end-1);//出错:特别注意这种start和end,千万不要直接取0和length-1
	}
}
该题非常容易出错,出错的地方主要在 IsTreeBST方法中的第一个判断:

if(end<=start)
	return true;
为什么返回的是true,而不是false。因为这个条件是 递归结束条件,而不是 输入合法性的判断条件。况且在 VerifySquenceOfBST函数中调用

IsTreeBST(sequence,0,sequence.length-1)已经确保了输入的合法性。

调用IsTreeBST的三种情况:
//第一种 全是右子树 i=start 调用最后的IsTreeBST左子树直接返回true 右子树递归递归最后root-1=i=start return true 
//第二种全是左子树 i=root 最后的IsTreeBST左子树递归递归 最后root-1=start返回true 右子树直接返回true 
//第三种 左子树右子树都有正常递归 继续直到进入前面两种情况之一

 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值