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

给一个数组,然后判断数组是不是一个二叉搜索树的后序遍历序列
二叉搜索树:左子节点小于根节点,右子节点大于根节点
后序遍历:左右根 先打印左子节点,在右子节点,然后根节点。

思路和代码

思路写在代码的注释里面了。

package practice;

/**
 * @author iu
 * 二叉搜索树的后序遍历序列
 * 给一个序列判断是不是某人二叉搜索树的后序遍序列
 * 递归
 * 最后一位数是根节点,二叉搜索树的左子节点小于根节点,右子节点大于根节点。
 * 所以找到左右子树的边界,然后判断右子数是否全大于根节点,如果右子树的所有节点中有一个小于根节点直接返回false
 * 对于左子树来说,最后一位也是根节点。所以按照上面的步骤继续找到左右的边界,然后把根节点和右子节点比较。
 * 直到划分的左子树只有一个子节点的时候就停止递归并且返回true
 */
public class VerifyArrayOfBST{

    public static boolean verifyArrayOfBST(int[] array, int start, int length) {
        //反正传的是空数组
        if (array == null) {
            return false;
        }
        //找到根节点的值
        int headValue = array[length - 1];
        int i = start;
        //得到左子树的范围
        for (; i < length - 1; i++) {
            if (array[i] > headValue) {
                break;
            }
        }
        int j = i;
        //判断右子树的元素有没有小于根节点的元素,有直接返回false
        for (; j < length - 1; j++ ) {
            if (array[j] < headValue) {
                return false;
            }
        }
        //开始递归 使用left 和 right 获取返回的值
        boolean left = true;
        boolean right = true;
        //如果左子树的元素小于2个元素时停止判断
        if (i - start > 1) {
            //传入递归的开始位置和数组长度
            left = verifyArrayOfBST(array, 0, i);
        }
        //如果右子树的元素小于2个元素时停止判断
        if (length - i > 1) {
            //传入递归的开始位置和数组长度
            right = verifyArrayOfBST(array, i,length - 1);
        }
        return left&&right;
    }

    public static void main(String[] args) {
        int[] array = {5,7,6,9,11,10,8};
        System.out.println(verifyArrayOfBST(array,0, array.length));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值