当前位置: 首页 > article >正文

Leetcode 验证二叉搜索树

在这里插入图片描述

java 实现

class Solution {
    public boolean isValidBST(TreeNode root) {
        return validate(root, null, null);
    }
    private boolean validate(TreeNode node, Integer min, Integer max) {
        if(node == null) return true;

        if(min != null && node.val <= min) return false;
        if(max != null && node.val >= max) return false;

        return validate(node.left, min, node.val) && validate(node.right, node.val, max);
    }
}

如何理解 min 和 max ?

验证二叉搜索树 的递归过程中,minmax 参数的作用是用于定义 当前节点值的有效范围。这个范围是由 父节点和祖先节点 传递下来的,并在递归过程中动态更新。


参数 minmax 的作用

  1. min:表示当前节点值不能小于等于的下界。
  2. max:表示当前节点值不能大于等于的上界。

通过递归的传参,这两个参数逐渐收窄了 当前节点的取值范围,从而确保二叉树满足 二叉搜索树 (BST) 的定义:

  • 左子树 的节点值必须小于当前节点值。
  • 右子树 的节点值必须大于当前节点值。

举例理解 minmax

给定如下二叉树:

    5
   / \
  3   7
 / \   \
2   4   8

递归过程minmax 的变化如下:

  1. 根节点 5

    • 初始范围:min = null, max = null
    • 说明:根节点没有限制,任何值都有效。
  2. 左子节点 3(左子树):

    • min = null, max = 5
    • 说明:左子节点必须 小于 5(当前根节点值)。
  3. 右子节点 7(右子树):

    • min = 5, max = null
    • 说明:右子节点必须 大于 5(当前根节点值)。
  4. 左子节点 3 的左子节点 2

    • min = null, max = 3
    • 说明:2 必须小于 3
  5. 左子节点 3 的右子节点 4

    • min = 3, max = 5
    • 说明:4 必须在 (3, 5) 范围内。
  6. 右子节点 7 的右子节点 8

    • min = 7, max = null
    • 说明:8 必须大于 7

代码对应解析

在代码中,minmax 的传递体现了有效范围的逐步收窄:

private boolean validate(TreeNode node, Integer min, Integer max) {
    if (node == null) return true;

    // 检查当前节点值是否在有效范围内
    if (min != null && node.val <= min) return false; // 小于等于下界,返回 false
    if (max != null && node.val >= max) return false; // 大于等于上界,返回 false

    // 递归检查左子树和右子树,更新范围
    return validate(node.left, min, node.val) && validate(node.right, node.val, max);
}
  • validate(node.left, min, node.val)
    • 左子树的有效范围是 minnode.val(上界收窄)。
  • validate(node.right, node.val, max)
    • 右子树的有效范围是 node.valmax(下界收窄)。

直观理解

  • 在递归过程中,minmax 就像是两堵“墙”,夹住了当前节点的有效取值范围。
  • 左子树 的节点向下传递时,右侧墙(max)会更新为父节点的值。
  • 右子树 的节点向下传递时,左侧墙(min)会更新为父节点的值。

最终,通过这两堵动态更新的“墙”,可以保证整棵树的所有节点都满足二叉搜索树的定义。


总结

  • minmax 用来动态收窄当前节点值的合法范围。
  • 每次递归到左子树或右子树时,都会根据父节点值更新上下界。
  • 通过这种方式,可以有效检查树中每个节点是否满足 BST 的规则。

http://www.kler.cn/a/443214.html

相关文章:

  • 【钉钉在线笔试题】字符串表达式的加减法
  • with as提高sql的执行效率
  • 计算机网络(三)——局域网和广域网
  • 【C++/控制台】2048小游戏
  • 递归构建树菜单节点
  • 腾讯云AI代码助手编程挑战赛——智能音乐推荐系统
  • C++类与对象学习笔记(一)
  • python 数据分析之地图数据绘制
  • linux系统下硬盘无法读写,但是服务器上硬盘没有告警,确定故障硬盘的信息
  • GPT-SoVITS语音合成模型部署及使用
  • 从零开始,一步一步搭建Typescript+React+Redux项目——集成react-router和axios(三)
  • socket编程UDP-实现停等机制(接收确认、超时重传)
  • 第二部分:进阶主题 15 . 安全管理 --[MySQL轻松入门教程]
  • “TA”说|表数据备份还原:SQLark 百灵连接助力项目部署验收
  • SQL中表相关的操作
  • 增材制造(3D打印):原理、类型、领域、优势、瓶颈、方向
  • Oracle JDK需登录下载解决
  • [Unity]Unity跨平台开发之针对Android开发
  • Nmap初步学习
  • React中定义和使用类式组件
  • nano编辑器的使用
  • 4.metagpt中的软件公司智能体 (ProjectManager 角色)
  • CSS Backgrounds(背景)
  • 干掉运动模糊!Deblur4DGS:清晰的高质量视频动态重建
  • Mongodb 启用认证
  • 图变换器的再思考:谱注意力网络