剑指offer第二十题(Java):二叉树的后序遍历

二叉树的后序遍历

题目描述

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

题目解析

后序遍历的数组有这样一个特征:最后一个为根节点,前一段为左子树,都比根节点小,后一段都为右子树,都比根节点大。然后我们再将前一段,后一段再进行递归判断是否符合要求。

代码解析

 public static boolean VerifySquenceOfBST(int [] sequence) {
		 if(sequence.length==0) {
			 return false;
		 }
		 //最后一位肯定为根节点,将根节点赋值给root
		 int root=sequence[sequence.length-1];
		 int i=0;
		 //从第一个数字开始判断是否小于root,小于root的就是左子树,如果大于的话则退出
		 for(;i<sequence.length-1;i++) {
			 if(sequence[i]>root) {
				 	break;
			 } 
		 }
		 //继续刚才的下标,现在是右子树,因为右子树都大于根节点,如果有小于根节点的则退出
		 int j=i;
		 for(;j<sequence.length-1;j++) {
			 if(sequence[j]<root) {
				 	return false;
			 }
		 }
		 //大的树完成验证,这时left,right为true,如果i大于0,则开始判断小子树,一直递归到最小
		 	boolean left=true;
	        if(i>0){
	            left=VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, i));
	        }
	        boolean right=true;
	        if(i<sequence.length-1){
	            right=VerifySquenceOfBST(Arrays.copyOfRange(sequence, i, sequence.length-1));
	         }
	        //只有左右字数都满足,皆可以满足条件
	        return (left&&right);
	    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值