LeetCode热题100--98. 验证二叉搜索树--中等

1. 题目

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

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

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

示例 1:

输入:root = 2,1,3

输出:true

示例 2:

输入:root = 5,1,4,null,null,3,6

输出:false

解释:根节点的值是 5 ,但是右子节点的值是 4 。

2. 题解

java 复制代码
/**
 * Definition for a binary tree node.
 * public 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;
 *     }
 * }
 */
class Solution {
    public boolean isValidBST(TreeNode root) {
        return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }

    private boolean isValidBST(TreeNode node, long left, long right) {
        if (node == null) {
            return true;
        }
        long x = node.val;
        return left < x && x < right &&
               isValidBST(node.left, left, x) &&
               isValidBST(node.right, x, right);
    }
}

3. 解析

出自:【视频】前序中序后序,三种方法,一个视频讲透!(Python/Java/C++/C/Go/JS/Rust)

  1. TreeNode 是一个用于描述二叉树节点的类,它包含三个属性:val(值), left(左子节点)和right(右子节点)。这个类的构造函数允许你创建一个新的TreeNode对象并设置它的属性。

  2. Solution 是一个解决BST相关问题的类。其中,sortedArrayToBST方法是将已排序的数组转换为二叉搜索树(Binary Search Tree)的方法。它使用了深度优先遍历(DFS)和分治法(Divide and Conquer)策略。

  • sortedArrayToBST(int\[\] nums): 这个方法接收一个整型数组作为输入,返回一个对应的二叉搜索树。

  • a. dfs方法:这是一个私有方法,用于递归地构建二叉搜索树。它首先检查当前子集是否为空(即lo > hi),如果是,则返回null来结束递归。然后计算中间索引mid,并创建一个新的TreeNode,它的值是numsmid。左子节点和右子节点的构建分别使用了dfs(nums, lo, mid - 1)和dfs(nums, mid + 1, hi)进行递归调用。

  • isValidBST: 这个方法用来检查一个二叉树是否是有效的二叉搜索树(Binary Search Tree)。它接收一个TreeNode类型的参数root,并返回一个布尔值结果。

  • a. isValidBST(TreeNode node, long left, long right): 这是一个私有方法,用于递归地检查每个节点是否满足二叉搜索树的规定。它首先检查当前节点是否为null(即node == null),如果是,则返回true来结束递归。然后将当前节点的值x与范围left和right进行比较,如果x不在这个范围内,或者左子树或右子树不是有效的二叉搜索树(通过isValidBST的递归调用来确定),那么就返回false。

相关推荐
小欣加油8 小时前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
lqqjuly8 小时前
前沿算法深度解析(二)
人工智能·算法·机器学习
徐小夕9 小时前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
akunkuntaimei9 小时前
2026年高考数学各省真题及答案(完整版)
算法·高考
Hello:CodeWorld10 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
8Qi811 小时前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
youngerwang12 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
KaMeidebaby13 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠14 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力14 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试