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

题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
(ps:我们约定空树不是二叉搜索树)
示例1
输入

[4,8,6,12,16,14,10]
返回值

true

思路分析:
二叉搜索树的特点是:如果当前节点有左子树,那么左子树的每一个节点的值都小于等于当前节点的值;如果当前节点有右子树,那么右子树的每一个点的值大于当前节点的值;
再来分析:树的后序遍历特点是什么,遍历顺序肯定是先左子树,后右子树,最后是根节点。
根据这两个特点我们可以知道,在传入的后续遍历序列里面,最后一个值是根节点,除了根节点,序列分为两部分:

以第一个大于根节点的值为分界线。第一个大于根节点的值之后的序列是根节点的右子树;
通过这些右子树的值来判断:

  • 每一个都大于根节点,
    如果大于表示当前节点满足平衡二叉树的特点。接下来我们分别对左子树和右子树做这样的处理。
  • 有一个不满足
    那就不是满足条件的后续遍历

重复两个操作,一直到没有节点可以被遍历。

代码展示:


/*
*输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
* 如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
* (ps:我们约定空树不是二叉搜素树)
* */
public class Solution {

    public boolean VerifySquenceOfBST(int [] sequence) {
        //二叉搜索树的特点,每个根节点都满足:节点的左子树都小于等于节点的值;节点的右子树都大于根节点的值
        //int index=sequence.length-1;
        if(sequence.length == 0){
            return false;
        }
        return traverse(sequence,0,sequence.length-1);

    }
    public boolean traverse(int[] sequence,int start,int end){
        if(start>=end){
            return true;
        }
        int key=sequence[end];
        int i=0;
        for( i=start;i<end;i++){
            if(sequence[i]>key)
                break;
        }
        for(int j=i;j<end;j++){
            if(sequence[j]<key){
                return false;
            }
        }
        return traverse(sequence,start,i-1)&&traverse(sequence,i,end-1);//在子树中遍历,除去根节点
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值