刷完LeetCode题库——98. 验证二叉搜索树

25 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情

题目详情

LeetCode题库序号 98. 验证二叉搜索树 ,难度为 中等

Tag : 「深度优先搜索」 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

image.png

输入: root = [2,1,3]
输出: true

示例 2:

image.png

输入: root = [5,1,4,null,null,3,6]
输出: false
解释: 根节点的值是 5 ,但是右子节点的值是 4

提示:

  • 树中节点数目范围在[1, 104] 内
  • -231 <= Node.val <= 231 - 1

深度优先搜索

题解思路:这道题目需要我们去验证一棵树是否为一个标准的二叉树,左子树和右子树的值是在一个区间的,首先,刚开始的时候左子树区间的最小值肯定是Long.MIN_VALUE,最大值就是根节点的值,而右子树区间的最大值肯定是Long.MAX_VALUE,最小值就是根节点的值了,随着深度优先搜索的不断进行,左子树和右子树的区间在不断的缩小。只要有节点的值不满足该层区间则是不满足二叉树的结构。详情见以下代码:

题解代码

public class Solution {

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

    public boolean isValidBST(TreeNode node, long lower, long upper) {
        if (node == null) {
            return true;
        }

        if (node.val <= lower || node.val >= upper) {
            return false;
        }

        return isValidBST(node.left, lower, node.val) && isValidBST(node.right, node.val, upper);
    }


    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode() {
        }

        TreeNode(int val) {
            this.val = val;
        }

        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
}

结尾

我的"刷完LeetCode题库"系列文章的第 No.98 序号的题目,本次刷题之旅系列开始于 2022-06-12,因为LeetCode上部分是有锁题,我自己的目标是将先把所有不带锁的题目刷完。自己能够通过这次刷题之旅勉励自己,并且提升逻辑思维能力。这个系列的文章就是会见证我自己的一个成长过程!

思路虽然不是最优的,但是我会尽我所能!

为了让我自己的刷题之旅不中断,我特地建立了相关的仓库,来记录我自己的刷题之旅。 github.com/jackpan123/…