LeetCode 98. 验证二叉搜索树

题目:

力扣

题解一:

根据搜索二叉搜索树的特性,中序序列为单调递增的升序列表,先求出中序序列,再验证是否单调递增,时间复杂度:O(n)。

    public boolean isValidBST(TreeNode root) {
        List<Integer> inOrderList = new ArrayList<>();
        inOrder(root, inOrderList);

        // 验证是否为递增序列
        if (inOrderList.size() > 1) {
            int preValue = inOrderList.get(0);
            for (int i = 1; i < inOrderList.size(); i++) {
                if (preValue >= inOrderList.get(i)) {
                    return false;
                }
                preValue = inOrderList.get(i);
            }
        }

        return true;
    }

    /**
     * 中序遍历
     *
     * @param root 节点
     * @param orderList 中序遍历序列
     */
    private void inOrder(TreeNode root, List<Integer> orderList) {
        if (root == null) {
            return;
        }

        inOrder(root.left, orderList);
        orderList.add(root.val);
        inOrder(root.right, orderList);
    }

题解二:

递归比较,递归遍历时,依次判断:

  1. 左孩子 < 根节点
  2. 右孩子 > 根节点

注意:

  1. 以上要求要满足整棵树,而非单颗子树,所以再遍历时需要加上节点值范围。
  2. 比较过程要,要注意临界值。

虽然节点 3、4、6构成的子树也满足BST,但是放在根节点为5的子树中就不再满足BST,节点5的右子树应该全部大于5,节点3、4不满足要求,所以这不是一颗BST。

    public boolean isValidBST(TreeNode root) {
        return dfsAndCompareValue(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }

    /**
     * 递归比较
     *
     * @param root 节点
     * @param lower 下限值
     * @param upper 上限值
     * @return 结果
     */
    public boolean dfsAndCompareValue(TreeNode root, long lower, long upper) {
        if (root == null) {
            return true;
        }

        // 如果当前节点不在指定范围,不是BST
        if (root.val <= lower || root.val >= upper) {
            return false;
        }

        // 1.左子树的上限值为当前节点值
        // 2.右子树的下限值为当前节点值
        return dfsAndCompareValue(root.left, lower, root.val) && dfsAndCompareValue(root.right, root.val, upper);
    }

时间复杂度:O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值