剑指offer-二叉搜索树的后续遍历

题目描述

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

public class Test {
    
    public static void main(String[] args) {
        int[] arr={5,7,6,9,11,10,8};
        System.out.println(verifySquenceOfBST(arr,0, 4));
    }
    
    /**
     * 在后序遍历得到的序列中, 最后一个数字是树的根结点的值。
     * 数组中前面的数字可以分为两部分: 第一部分是左子树结点的值,它们都比根结点的值小
     * 第二部分是右子树结点的值,它们都比根结点的值大。
     * @param sequence 
     * @param start 起始点
     * @param length 序列长度
     * @return 
     */
    public static boolean verifySquenceOfBST(int[] sequence, int start, int length) {
        // 序列为空,返回false
        if(sequence == null || length <= 0) 
            return false;
    
        // 二叉树根节点,后序遍历序列的最后一个
        int root = sequence[length - 1];
        // 左子树结点的数都小于根节点
        int i = 0;
        for(; i < length - 1; i++) {
            if(sequence[i] > root)  // 大于根节点,跳出循环
                break;
        }
        // 右子树结点的数都大于根节点
        int j = i;
        for(; j < length - 1; j ++) {
            if(sequence[j] < root) 
                return false;     // 右子树中出现大于根节点的数,直接返回false
        }
        
        // 判断左子树是不是二叉搜索树
        boolean left =true;
        if(i > 0) {  // 左子树存在
            left = verifySquenceOfBST(sequence, 0 ,i);
        }
        
        // 判断右子树是不是二叉搜索树
        boolean right = true;
        if(i < length - 1) { // 右子树存在
            right = verifySquenceOfBST(sequence, i, length - i - 1);
        }
        
        return left && right;
    }

}

 

posted @ 2016-08-16 14:58  no_one  阅读(242)  评论(0编辑  收藏  举报