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'))
相关推荐
PAK向日葵8 小时前
从零实现 Python 虚拟机(一):PVM 基本原理介绍
python
神所夸赞的夏天9 小时前
创建虚拟环境提示SSLError错误
python
极光代码工作室9 小时前
基于机器学习的二手商品价格预测系统
人工智能·python·深度学习·机器学习
无情的西瓜皮9 小时前
MCP协议实战:从零搭建一个AI Agent工具服务器
运维·服务器·python
叁散9 小时前
ESP32 LCD1602显示实验报告
算法
过期动态9 小时前
【LeetCode 热题 100】盛最多水的容器
java·数据结构·spring boot·算法·leetcode·spring cloud·职场和发展
IT策士9 小时前
Django 从 0 到 1 打造完整电商平台:系列总结 + 项目演示与后续扩展
后端·python·django
凌波粒9 小时前
LeetCode--700.二叉搜索树中的搜索(二叉树)
算法·leetcode·职场和发展
君为先-bey9 小时前
LeMiCa——基于扩散模型的高效视频生成的词典序最小化路径缓存
python·算法·机器学习·扩散模型
L_cl10 小时前
大模型应用开发 9.FastAPI ① 请求与响应
python·fastapi