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

来源:互联网 发布:ac尼尔森 网购数据 编辑:程序博客网 时间:2024/06/05 21:01

题目链接地址:
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);    }  
1 0