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
相关推荐
fengfuyao9851 小时前
基于MATLAB的HHT变换完整实现(含EMD分解与三维时频谱生成)
开发语言·算法·matlab
罗超驿1 小时前
16.滑动窗口经典例题:最小覆盖子串(LeetCode 76)算法原理剖析
算法·leetcode·职场和发展
我登哥MVP1 小时前
Spring Boot 从“会用”到“精通”:请求映射原理
java·spring boot·后端·spring·servlet·maven·intellij-idea
luj_17681 小时前
马克思的跨学科学术体系
c语言·开发语言·c++·经验分享·算法
阿文的代码库1 小时前
干货分享|C++运算符重载知识点
java·c++·算法
码不停蹄的玄黓1 小时前
Java 实现阻塞队列
java·开发语言
SunnyDays10111 小时前
Java 实现 PDF 转 PDF/A 和 PDF/A 转 PDF(超详细教程)
java·开发语言·pdf
Deep-w1 小时前
【MATLAB】基于 MATLAB 的直流电动机双闭环调速系统建模与仿真
开发语言·算法·matlab
muddjsv2 小时前
Java语言学习路线全解析:从入门到精通的核心模块与进阶路径
java