剑指offer之个人刷题历程记录

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

题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
知识点:
二叉搜索树
解题思路:
首先题目说二叉搜索树,所以要搞清楚二叉搜索树的概念,二叉搜索树就是我们所说的二叉排序树,二叉排序树也就是满足以下性质的二叉树:若它的左子树不空,则左子树上所有关键字的值均小于根关键字的值;若它的右子树不空,则右子树上所有关键字的值均大于根关键字的值。左右子树又各是一棵二叉排序树。
根据二叉排序树的概念可知,后序遍历序列最后一个元素是该二叉排序树的根节点,二叉排序树的左子树始终小于根节点,右子树是始终大于根节点。于是根节点之前的元素可以分为两部分,左子树和右子树。同理左子树和右子树的结构也做同样处理,即一个递归的过程。类似于之前写过的重建二叉树的过程。
具体代码:

import java.util.Arrays;

public class Solution {
   public boolean VerifySquenceOfBST(int [] sequence) {
       int len=sequence.length;
       if(sequence==null||len<=0)
   		return false;
   	int root=sequence[len-1];
   	int i=0;
   	int j=0;
   	//确定左子树部分的节点
   	for(i=0;i<len-1;i++) {
   		if(sequence[i]>root)
   			break;
   	}
   	//左子树的根节点为i-1
   	//确定右子树部分的节点
   	System.out.println(i);
   	for(j=i;j<len-1;j++) {
   		if(sequence[j]<root)
   			return false;
   	}
   	//判断左子树是不是二叉搜索树
   	boolean left=true;
   	int[] leftsequence=Arrays.copyOfRange(sequence, 0, i);
   	if(i>0)
   		left=VerifySquenceOfBST(leftsequence);
   	//判断右子树是不是二叉搜索树
   	boolean right=true;
   	int[] rightsequence=Arrays.copyOfRange(sequence, i, len-1);
   	if(i<len-1)
   		right=VerifySquenceOfBST(rightsequence);
   	
   	return (left&&right);
   }
}

注意点:
确定左右子树的时候确定下标时要注意数字的正确,这里在确定左右子树时,用了Arrays.copyOfRange函数来截取生成新的子数组;并没有提醒运行内存和时间超过限制。但是个人认为递归运行一直生成数组,会占用额外的空间。可以另外写一函数,根据长度来确定左右子树。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值