力扣刷题TOP101: 27.BM34 判断是不是二叉搜索树

目录:

目的

思路

复杂度

记忆秘诀

python代码

目的:

给定一个二叉树根节点,请判断这棵树是不是二叉搜索树。

二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。


思路

什么是二叉搜索树(BST)?

  • 每个节点 的值必须比其左子树 的所有节点值大。
  • 每个节点 的值必须比其右子树 的所有节点值小。
  • 也就是说,树中的每个节点都有一个范围 (区间)约束。

  • 主函数 isValidBST:

    • 入口函数,调用一个辅助函数 validate,开始递归检查整棵树是否满足 BST 的规则。
  • 辅助函数 validate(node, low, high):

    • 参数解释:
      • node:当前要检查的节点。
      • low:当前节点的值不能小于的最小值。
      • high:当前节点的值不能大于的最大值。
    • 功能:递归检查每个节点是否在合法范围内。

检查逻辑:

  • 情况 1:节点为空。
    • 空节点不违反任何规则,所以直接返回 True。
  • 情况 2:节点值不在范围内。
    • 如果节点的值小于 low 或大于 high,就返回 False。
  • 情况 3:递归检查子树。
    • 检查左子树时,将 high 更新为当前节点值,因为左子树所有节点值必须小于当前节点值。
    • 检查右子树时,将 low 更新为当前节点值,因为右子树所有节点值必须大于当前节点值。

示例:

Matlab 复制代码
        5
       / \
      3   7
     / \
    2   4

初始调用:validate(5, -inf, inf)

  • 节点值为5,范围是(-∞, ∞),符合规则。
  • 检查左子树:调用 validate(3, -inf, 5)。
  • 检查右子树:调用 validate(7, 5, inf)。

递归检查左子树(以节点3为根)

  1. 调用 validate(3, -inf, 5):

    • 节点值为3,范围是(-∞, 5),符合规则。
    • 检查左子树:调用 validate(2, -inf, 3)。
    • 检查右子树:调用 validate(4, 3, 5)。
  2. 调用 validate(2, -inf, 3):

    • 节点值为2,范围是(-∞, 3),符合规则。
    • 左右子树为空,返回 True。
  3. 调用 validate(4, 3, 5):

    • 节点值为4,范围是(3, 5),符合规则。
    • 左右子树为空,返回 True。

递归检查右子树(以节点7为根)

  1. 调用 validate(7, 5, inf):
    • 节点值为7,范围是(5, ∞),符合规则。
    • 左右子树为空,返回 True。

最后结果

所有节点都符合规则,最终返回 True。


复杂度

  • 时间复杂度:O( n)

    • 对每个节点只进行了访问一次,其中 n 是树中的节点数。
  • 空间复杂度:O(n )

    • 递归调用栈的深度等于树的高度。
    • 在最坏的情况下(完全不平衡的树),空间复杂度为 O(n)。
    • 在最好的情况下(平衡的树),空间复杂度为 O(log n)。

记忆秘诀

  • 通过递归和范围约束,逐步验证每个节点是否符合 BST 的规则。
  • 每个节点的值必须在它的范围内,否则就返回 False。
    • 左子树的值范围是 (-∞, 当前节点值),右子树的值范围是 (当前节点值, ∞)。

python代码

python 复制代码
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        # 辅助函数,用于递归验证每个节点
        def validate(node, low=float('-inf'), high=float('inf')):
            # 如果当前节点为空,返回 True
            if not node:
                return True
            
            # 检查当前节点的值是否在有效范围内
            if not (low < node.val < high):
                return False
            
            # 递归检查左子树和右子树
            return (validate(node.left, low, node.val) and
                    validate(node.right, node.val, high))

        return validate(root)

* 欢迎大家探讨新思路,能够更好的理解和记忆

相关推荐
用户8356290780514 分钟前
使用 Python 控制 Excel 工作表的分页位置
后端·python
用户83562907805114 分钟前
Python 如何在 Word 中添加和管理文档变量
后端·python
用户019027581613 小时前
Dify / Coze 低代码 Agent 怎么接 A 股行情?
python
Dumbness3 小时前
不传 day 参数,座位图显示全空:用 Python 标准库手写 Web 框架,请求到业务代码前的 5 个细节
后端·python
通信小呆呆4 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
笑容掩饰我的失落4 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
databook4 小时前
收上来一堆 Excel,怎么保证没改错
python·数据分析
Severus_black5 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_967987375 小时前
Python 教程:默认字典(defaultdict)全维度深度指南
python·性能优化·数据处理·collections·defaultdict
鱼听禅5 小时前
Ubuntu安装YOLOv8进行菌落识别训练
linux·python·yolo·ubuntu