输入一个后序遍历后的数组,判断是否能有一颗树满足-java

/**
 *
 *     思路: 先找出最右右孩子的位置,那么从此位置到父节点之间不能含有比
 *     父节点小的节点;
 *     然后以此位置有分界点,遍历左子树和右子树
 */
public class Test {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
        test4();
        test5();
        test6();
    }

    /**
     * 既有左子树又有右子树
     */
    static void test1() {
        int[] arr = {5,7,6,9,11,10,8};
        System.out.println(existTree(arr, 0, arr.length - 1));
    }

    /**
     * false
     */
    static void test2() {
        int[] arr = {};
        System.out.println(existTree(arr, 0, arr.length - 1));
    }

    /**
     * 只有右子树
     */
    static void test3() {
        int[] arr = {9,8,7,6};
        System.out.println(existTree(arr, 0, arr.length - 1));
    }

    /**
     * false
     */
    static void test4() {
        int[] arr = {9,5,7,6};
        System.out.println(existTree(arr, 0, arr.length - 1));
    }

    /**
     * 只有左子树
     */
    static void test5() {
        int[] arr = {4,6,5,7};
        System.out.println(existTree(arr, 0, arr.length - 1));
    }

    /**
     * false
     */
    static void test6() {
        int[] arr = {4,7,5,6};
        System.out.println(existTree(arr, 0, arr.length - 1));
    }

    public static boolean existTree(int[] arr, int left, int right) {
        if (arr == null || arr.length < 1) {
            return false;
        }

        if (left >= right ) { 
            return true;
        }

        int righterChildInx =  right;

        for (int i = right - 1; i > -1; i--) {
            if (arr[i] > arr[right]){
                righterChildInx = i;
            }
        }

        for (int j = righterChildInx; j <= right; j++){
            if (arr[j] < arr[right]){
                return false;
            }
        }

        return existTree(arr, left, righterChildInx - 1) == true &&
                existTree(arr, righterChildInx, right - 1) == true;

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值