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

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

【思路】首先我们得知道什么是二叉搜索树,二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。由这个性质我们可以知道,根节点左边的元素一定比根节点小,根节点右边的元素一直比根节点大,左右子树也符合这个规律,由于是后序遍历,所以整数数组的最后一个元素为根节点,它前面比它小都是左子树元素,比它大的都是右子树元素,而且左右子树都符合这个规律。所以我们获取整数数组的最后一个元素当做根节点,然后遍历它前面的所有元素,找到第一个比它大的,那么以这个元素为分界,前面的都是左子树元素,后面都是右子树元素,如果这个元素后面的所有元素都比根节点大,说明是正确的,反之则错误,正确我们继续分左右子树判断即可

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        return check(sequence,0,sequence.length-1);
    }
    
    public boolean check(int []array,int begin,int end){
        //如果只有一个元素了,递归最深处,返回true
        if(begin >= end)
            return true;
        int root = array[end];
        int firstMax = -1;
        for(int index = begin;index < end;index ++){
            if(array[index] > root){
                firstMax = index;
                break;
            }
        }
        //如果没有找到比根节点大的,说明没有右子树,那么直接判断左子树
        if(firstMax == -1)
            return check(array,begin,end-1);
        
        //如果有右子树,那么检查右子树是否全部大于根节点
        for(int i = firstMax+1;i < end;i++){
            //如果右子树存在比根节点小的,返回false
            if(array[i] < root)
                return false;
        }
        //递归检查左右子树
        return (check(array,begin,firstMax-1) && check(array,firstMax,end-1));
    }
}
posted @ 2016-05-05 16:29  27House  阅读(370)  评论(0编辑  收藏  举报