98.验证二叉搜索树

题目描述

题目描述

题解一(递归,设定上下边界)

思路

递归思路

代码

java 复制代码
class Solution {
    public boolean isValidBST(TreeNode root) {
        // 使用 Long 的最大最小值来初始化边界,防止测试用例中出现 Integer.MAX_VALUE 导致判断错误
        return isValid(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }

    private boolean isValid(TreeNode node, long lower, long upper) {
        if (node == null) {
            return true;
        }
        
        // 如果当前节点的值不在允许的范围内,则不是二叉搜索树
        if (node.val <= lower || node.val >= upper) {
            return false;
        }
        
        // 递归检查左子树(上限改为当前节点的值)和右子树(下限改为当前节点的值)
        return isValid(node.left, lower, node.val) && isValid(node.right, node.val, upper);
    }
}

题解二(中序遍历)

思路

中序遍历思路

代码

java 复制代码
class Solution {
    // 记录前一个遍历到的节点的值,初始设为 Long.MIN_VALUE
    //把 pre 声明为类的成员变量时,所有的递归调用都在共享这同一个变量
    private long pre = Long.MIN_VALUE;

    public boolean isValidBST(TreeNode root) {
        if (root == null) {
            return true;
        }
        
        // 1. 访问左子树
        if (!isValidBST(root.left)) {
            return false;
        }
        
        // 2. 访问当前节点:如果当前节点的值小于等于前一个节点的值,说明破坏了递增性
        if (root.val <= pre) {
            return false;
        }
        pre = root.val; // 更新 pre 为当前节点的值
        
        // 3. 访问右子树
        return isValidBST(root.right);
    }
}

复杂度分析

  • 时间复杂度:O(N)O(N)O(N),其中 NNN 是二叉树的节点数。每个节点恰好被访问一次
  • 空间复杂度:O(H)O(H)O(H),其中 HHH 是二叉树的高度。最坏情况下(树退化成链表),递归调用栈的深度为 NNN;最好情况下(平衡二叉树),深度为 log⁡N\log NlogN
相关推荐
血色橄榄枝12 小时前
基于用户注册信息的关键词检测挑战赛「Datawhale AI 夏令营」
人工智能·算法·机器学习
Java搬码工13 小时前
CompletableFuture 完整详解 + 全场景使用案例
java
许心月13 小时前
Java学习资料网站汇总
java
c2385613 小时前
第二篇:《测试指挥官:可视化单题自测框架(含 assert 实操)》
java·数据库·c++·算法·安全性测试
帅次14 小时前
Kotlin 与 Java 互操作:混合工程里的平台类型与 API 边界
java·开发语言·kotlin·suspend·nullable
六点_dn14 小时前
Linux学习笔记-printf命令
linux·运维·算法
X-⃢_⃢-X14 小时前
一、第一阶段:认识 Spring Boot
java·spring boot·后端
前端工作日常14 小时前
我学习到的Java程序的生命周期
java·后端
SunnyDays101115 小时前
Java 实现 PDF 页面删除、排序、旋转和裁剪
java·pdf
遥感知识服务15 小时前
Sentinel-1 + DEM + FwDET + 随机森林:从快速水深初估到多因子误差修正
算法·随机森林·sentinel