LeetCode(python)98.验证二叉搜索树

题目

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

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

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

示例 1:

复制代码
输入:root = [2,1,3]
输出:true

示例 2:

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

提示:

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

思路

1.首先明确二叉搜索树:任意节点的左子树的值 < 当前节点的值;节点的右子树的值 > 当前的值

2.核心思路:递归 + 边界约束

递归遍历每个节点,为每个节点传递合法的取值范围

(1)递归规则:

  • 遍历左子树时,所有的节点都应该小于当前的节点 → 更新左子树上界为当前节点值,下界保持不变
  • 遍历右子树时,所有的节点都应该大于当前的节点 → 更新右子树下界为当前节点值,上界保持不变

(2)终止条件:

  • 当前节点为空 → return True
  • 违背了递归规则 → return False

(3)初始条件:

对于root而言,没有父节点,上下界可设置为节点值的min和max,即[-inf, inf]

代码

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        def dfs(node: Optional[TreeNode], low: int, high: int) -> bool:
            if not node: return True   # 空节点,return True
            if node.val <= low or node.val >= high: return False   # 违背了规则,return False
            return dfs(node.left, low, node.val) and dfs(node.right, node.val, high)   # 递归遍历左右子树,并传递合法的取值范围
        return dfs(root, float('-inf'), float('inf'))
相关推荐
Σίσυφος19002 分钟前
PCL法向量估计 之 RANSAC 平面估计法向量
算法·机器学习·平面
xhbaitxl7 分钟前
算法学习day39-动态规划
学习·算法·动态规划
I_LPL9 分钟前
day23 代码随想录算法训练营 回溯专题2
算法·hot100·回溯算法·求职面试
智者知已应修善业10 分钟前
【洛谷P9975奶牛被病毒传染最少数量推导,导出多样例】2025-2-26
c语言·c++·经验分享·笔记·算法·推荐算法
玩大数据的龙威14 分钟前
农经权二轮延包—各种地块示意图
python·arcgis
ZH154558913116 分钟前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
belldeep25 分钟前
python:用 Flask 3 , mistune 2 和 mermaid.min.js 10.9 来实现 Markdown 中 mermaid 图表的渲染
javascript·python·flask
喵手25 分钟前
Python爬虫实战:电商价格监控系统 - 从定时任务到历史趋势分析的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·电商价格监控系统·从定时任务到历史趋势分析·采集结果sqlite存储
m0_7369191027 分钟前
C++中的委托构造函数
开发语言·c++·算法
小小小小王王王32 分钟前
洛谷-P1886 【模板】单调队列 / 滑动窗口
c++·算法