剑指offer【二叉搜索树的后序遍历序列】(java版)

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

思路:

二叉搜索树又叫二叉排序树,它的父节点总是大于左子节点(如果左子节点不为空),总是小于右子节点(如果右子节点不为空)。且对二叉搜索树进行中序遍历,得到一个有序升序序列。

(1).基于此性质,我们可知对一个二叉搜素树进行后续遍历,则最后一个节点为根节点。

(2).根节点左边节点对应的值小于根节点,根节点右边节点对应的值大于根节点。

(3).对一个数组,若数组为某二叉搜索树的后续遍历序列,则满足数组末尾元素为二叉搜索树的根节点值。依次从小到大遍历数组,找到第一个大于末尾元素的元素,则此元素的左右两侧元素分别是根节点的左右子树对应的元素。左右子树同样满足上述规则。

(4).对一个未知数组,从下标索引为零开始,让数组中的元素与数组最后一个元素比较。依次往后遍历,直到数组中元素大于数组中最后一个元素,则认为小于此下标索引的元素为根节点的左子树,大于此下标索引的元素为根节点的右子树。

(5).把此下标索引的左和右分别看成两个数组,按照(3)的条件依次递归,直到数组中为一个元素,如果满足条件则判断为true,否则判断为false。

代码实现如下:

public class Solution {
   public boolean VerifySquenceOfBST(int[] sequence){
    //如果数组为空或者长度小于等于零则返回false
    if(sequence==null||sequence.length<=0){
        return false;
    }
    //传入三个参数:数组序列、数组序列开始下标索引、结束下标索引。
    return VerifySquenceOfBST(sequence,0,sequence.length-1);
   }
  private boolean VerifySquenceOfBST(int[]sequence,int start,int end){
    //判断大小下标索引是否相等,如果相等则返回true
    if(start>=end){
        return true;
    }//把数组中的末尾元素赋值
    int root = sequence[end];
    //把数组中的开始元素赋值
    int m = start;
    //寻找数组中第一个大于末尾元素的元素下标索引,若数组是二叉搜索树的后序遍历序列,则此元素的右 
    //边元素都大于末尾元素。
    while(sequence[m]<root){
       m++;
    }
    int n = m;
    while(n<end){
        //如果数组中此元素的右边存在小于末尾元素的元素,则直接返回false
        if(sequence[n]<root){
            return false;
        }
        n++;
    }    
    //递归判断此元素的左右元素
    boolean left = VerifySquenceOfBST(sequence,start,m-1);
    boolean right = VerifySquenceOfBST(sequence,n+1,end);
    //返回判断结果
    return left&&right;
 }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值