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

题目链接地址:
http://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd?tpId=13&tqId=11176&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

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

二叉搜索树也叫二叉排序树,即左孩子的值全都小于根节点,右孩子的值全都大于根节点,根节点的左右孩子也是二叉搜索树。
给定如下一颗二叉搜索树:
这里写图片描述
(注:我写的时候图片显示的是下面的二叉排序树,现在竟然显示的是别人的java项目结构图!!!)
这里写图片描述
其后序遍历为:2 9 5 16 17 15 19 18 12。
现在假设给定了某个后序遍历数组为:2 9 5 16 17 15 19 18 12
我们从根节点出发,即节点12,如果此数组是某个二叉排序树后续遍历的结果,也就说数组中的数据必然可以分成两部分:一部分是全小于12,一部分全大于12,我们先从数组找第一个大于12的数即16,那么可以该数组可以被分成两部分
第一部分:2 9 5
第二部分:16 17 15 19 18
要使根节点12满足二叉排序树的定义,那么必定有第一部分全部小于12,第二部分全部大于12。
此时第一部分和第二部分又变成了根节点12的左右孩子要满足二叉搜索树的情况,第一部分表示的子树的根节点为5,第二部分表示的子树的根节点为18,即我们现在要判断根节点为5和根节点为18的两棵树是否都满足二叉排序树的定义,这是一个递归的过程。

    class ListNode{
        int val;
        ListNode next=null;
        ListNode(int val) {
            this.val=val;
        }
    }
        public int findPosition(int[] sequence,int start,int end,int val){
        //从sequence的start-end找到第一个大于val的位置
        int i=start;
        for(;i<=end;i++){
            if(sequence[i]>val)
                break;
        }
        return i;
    }
    public boolean isSquenceOfBST(int[] sequence,int start,int end){
        if(end<0||start>=sequence.length)
            return true;
        int val=sequence[end];
        int position=0;
        if(start<end){
            //将数组在position为位置分成两部分,左边一部分必然全小于val,右边一部分必然要全大于val
            position=findPosition(sequence, start, end-1, val);
            for(int i=position;i<=end;i++){
                if(sequence[i]<val) //如果出现右边部分有数字小于val则不符合二叉搜索树的定义
                    return false;
            }
        }else{
            return true;
        }
        //判断左右子树是否符合二叉搜索树的定义
        return isSquenceOfBST(sequence,start,position-1)&&
                isSquenceOfBST(sequence, position, end-1);
    }
    /**
     * 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果
     * */
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length<=0)
            return false;
        return isSquenceOfBST(sequence, 0, sequence.length-1);
    }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zlp1992

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值