98. 验证二叉搜索树

98. 验证二叉搜索树

核心逻辑

验证二叉搜索树(BST)需要满足:

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

本解法采用 分治 + 上下界约束 的策略:

  • 每层递归传入当前节点允许的 最大值(max)最小值(min)
  • 左子树的节点值必须小于当前节点值(更新 max 为当前节点值)。
  • 右子树的节点值必须大于当前节点值(更新 min 为当前节点值)。
  • 一旦某个节点超出范围,立即返回 false

🎉不断更新max和min,使节点值在一个合理的区间之内

🔥代码实现(含详细变量注释)

class Solution {
    public boolean isValidBST(TreeNode root) {
        // 初始调用:根节点的值必须介于 Long.MIN_VALUE 和 Long.MAX_VALUE 之间
        // 使用 Long 类型是为了防止测试用例中节点值等于 Integer 边界时出问题
        return Helper(root, Long.MAX_VALUE, Long.MIN_VALUE);
    }
    /**
     * 递归辅助函数,用于验证以 root 为根的子树是否为 BST
     * 
     * @param root 当前需要验证的树节点
     * @param max  当前节点允许的最大值(上界),即该节点 val 必须 < max
     * @param min  当前节点允许的最小值(下界),即该节点 val 必须 > min
     * @return     以 root 为根的子树是否是有效的 BST
     */
    public boolean Helper(TreeNode root, long max, long min) {
        // 基本情况:空节点符合 BST 定义
        if (root == null) {
            return true;
        }

        // 关键判断:如果当前节点值 大于等于 上界(max) 或者 小于等于 下界(min),则不合法
        // 注意:BST 定义要求 左 < 根 < 右,所以等于号也不满足
        if (root.val >= max || root.val <= min) {
            return false;
        }

        // 分治思想:递归验证左右子树
        // 左子树:所有节点值必须 < root.val,所以上界(max) 更新为 root.val,下界(min) 保持不变
        // 右子树:所有节点值必须 > root.val,所以下界(min) 更新为 root.val,上界(max) 保持不变
        return Helper(root.left, root.val, min) && Helper(root.right, max, root.val);
    }
}
  • ⏱️复杂度分析
    • 时间复杂度:O(N),其中 N 是二叉树的节点数。需要遍历每个节点一次。

    • 空间复杂度:O(H),其中 H 是二叉树的高度。最坏情况下(树为链状)递归深度为 N,空间复杂度为 O(N);最好情况下(平衡树)空间复杂度为 O(log N)。