码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-12 18:39:13      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

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

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

二叉搜索树也叫二叉排序树,即左孩子的值全都小于根节点,右孩子的值全都大于根节点,根节点的左右孩子也是二叉搜索树。
给定如下一颗二叉搜索树:
技术分享
其后序遍历为: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);
    }  

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

标签:

原文地址:http://blog.csdn.net/zlp1992/article/details/51353481

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!