<剑指offer> 第21题

题目:

输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历的结果。如果是则返回true,否则返回false

思路:

后序遍历的特点,最后一个数字为树的根节点的值,数组中前边的数字可以分为两部分,第一部分是左子树的值,都比根节点小,第二部分都是右子树的值,都比根节点大

代码:

public class TwentyFirst {

    public boolean whetherPostOrder(int[] arr){
        if(arr == null){
            return false;
        }
        return checkPostOrder(arr, 0, arr.length - 1);
    }

    public static boolean checkPostOrder(int[] arr, int start, int end){
        //如果需要处理的数据只有一个或者没有数据要处理了,就返回true
        if(start >= end){
            return true;
        }

        //从左到右找第一个不小于根节点的元素的位置
        int index = start;
        while(index < end - 1 && arr[index] < arr[end]){
            index ++;
        }
        //从第一个不小于根节点元素的位置一直到根节点的位置
        int right = index;
        while(index < end - 1 && arr[index] > arr[end]){
            index ++;
        }

        if(index != end - 1){
            return false;
        }
        
        index = right;
        return checkPostOrder(arr, start, right - 1) && checkPostOrder(arr, right, end - 1);
        
    }
}

 

posted @ 2019-08-10 20:40  HarSong13  阅读(150)  评论(0编辑  收藏  举报