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'))
相关推荐
岁岁的O泡奶1 分钟前
NSSCTF_reverse_[SWPUCTF 2022 新生赛]base64——[HDCTF 2023]easy_re
经验分享·python·逆向
阿Y加油吧1 分钟前
二分查找进阶:旋转排序数组的两道经典题深度解析
数据结构·算法
wgzrmlrm745 分钟前
Django怎么优雅发送邮件_Python配置SMTP后端实现异步通知
jvm·数据库·python
想带你从多云到转晴5 分钟前
05、数据结构与算法---栈与队列
java·数据结构·算法
無限進步D5 分钟前
蓝桥杯赛后总结
算法·蓝桥杯·竞赛
QuZero10 分钟前
ReentrantLock principle
java·算法
kcuwu.11 分钟前
Python 数据分析实战:NumPy、Pandas、Matplotlib 融合
python·数据分析·numpy
m0_7167652311 分钟前
数据结构--顺序表的插入、删除、查找详解
c语言·开发语言·数据结构·c++·学习·算法·visual studio
Thomas214311 分钟前
skill分享 iterm2 jupyter jumpserver
ide·python·jupyter
Jasmine_llq12 分钟前
《B3954 [GESP202403 二级] 乘法问题》
算法·顺序输入输出算法·布尔标记算法·累乘算法·循环迭代算法·阈值判断算法·条件分支输出算法