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

题目描述

       输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No;

       假设输入的数组的任意两个数字都互不相同。

二叉搜索树(BST)的定义

       1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

       2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

       3. 任意节点的左、右子树也分别为二叉查找树;

       4. 没有键值相等的节点

解题思路

       1.首先,要从二叉搜索树的特征入手;

       2.这道题很自然地可以想到用递归的方式去做;当然,不用递归也是可以的;

      3.如果它是一个二叉搜索树的后序遍历序列,那么这个序列的最后那个数一定是这个子树的root节点;去掉这个root节点,前的序列能分成两个部分,一个小于root,一个大于root;只要把这两个序列的分界点找到,用递归的方法分别对他们进行处理即可;

    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence == null || sequence.length == 0){
            return false;
        }
        if(sequence.length == 1){
            return true;
        }

        return verify(sequence, 0, sequence.length-1);
    }
    
    public boolean verify(int[] sequence,int star,int end){
        if(star >= end){
            return true;   //注意这个递归结束条件
        }
        
        int rootVal = sequence[end];
        int curIndex = star;
        
        while (curIndex < end && sequence[curIndex] < rootVal){
            curIndex++;   //从前面往后,前面那部分都是小于rootVal的
        }
        
        for (int i = curIndex+1;i < end; i++){
            if (sequence[i] < rootVal){
                return false;   //后面那部分的所有元素必须都大于rootVal
            }
        }

        return verify(sequence,star,curIndex) && verify(sequence, curIndex+1, end-1);
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值