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

目录:

目的

思路

复杂度

记忆秘诀

python代码

目的:

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

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


思路

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

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

  • 主函数 isValidBST

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

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

检查逻辑:

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

示例:

        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代码

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux-12 关于shell(十一)ls

登录系统输入用户名和密码以后&#xff0c;会显示给我们一个命令提示符&#xff0c;就意味着我们在这里就可以输入命令了&#xff0c;给一个命令&#xff0c;这个命令必须要可执行&#xff0c;那问题是我的命令怎么去使用&#xff0c;命令格式有印象吗&#xff1f;在命令提示符…

视觉语言模型 Qwen2-VL

视觉语言模型 Qwen2-VL flyfish from PIL import Image import requests import torch from torchvision import io from typing import Dict from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor from modelscope import snapshot_dow…

learn-(Uni-app)跨平台应用的框架

使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一份代码&#xff0c;可发布到iOS、Android、Web&#xff08;包括微信小程序、百度小程序、支付宝小程序、字节跳动小程序、H5、App等&#xff09;等多个平台。 跨平台&#xff1a;Uni-app 支持编译到iOS、Android、W…

java+ssm+mysql校园物品租赁网

项目介绍&#xff1a; 使用javassmmysql开发的校园物品租赁网&#xff0c;系统包含管理员、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;用户管理&#xff1b;物品管理&#xff08;物品种类、物品信息、评论信息&#xff09;&#xff1b;订单管理&#xff1…

肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)

大家好&#xff01;我是凯哥&#xff0c;今天给大家分享一下云计算学习路线图。这是我按照自己最开始学习云计算的时候的学习路线&#xff0c;并且结合自己从业多年所涉及的知识精心总结的云计算的思维导图。这是凯哥精心总结的&#xff0c;花费了不少精力哦&#xff0c;希望对…

31.下一个排列 python

下一个排列 题目题目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;题目链接 题解解题思路python实现代码解释&#xff1a;提交结果 题目 题目描述 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3…

ISO45001职业健康安全管理体系涵盖了丰富的内容

范围与术语 适用范围&#xff1a;明确规定了该标准适用于任何有愿望建立、实施和保持职业健康安全管理体系的组织&#xff0c;旨在使组织能够通过管理体系的有效运行&#xff0c;预防和控制职业健康安全风险&#xff0c;持续改进职业健康安全绩效。术语定义&#xff1a;对职业…

【OpenCV】平滑图像

二维卷积(图像滤波) 与一维信号一样&#xff0c;图像也可以通过各种低通滤波器&#xff08;LPF&#xff09;、高通滤波器&#xff08;HPF&#xff09;等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…

springSecurity自定义登陆接口和JWT认证过滤器

下面我会根据该流程图去自定义接口&#xff1a; 我们需要做的任务有&#xff1a; 登陆&#xff1a;1、通过ProviderManager的方法进行认证&#xff0c;生成jwt&#xff1b;2、把用户信息存入redis&#xff1b;3、自定义UserDetailsService实现到数据库查询数据的方法。 校验&a…

PowerShell install 一键部署postgres17

postgres 前言 PostgreSQL 是一个功能强大的开源对象关系数据库系统,拥有超过 35 年的积极开发经验 这为其赢得了可靠性、功能稳健性和性能的良好声誉。 通过官方文档可以找到大量描述如何安装和使用 PostgreSQL 的信息。 开源社区提供了许多有用的地方来熟悉PostgreSQL, 了…

Redis——内存淘汰策略

Redis的淘汰策略是指当Redis内存使用达到上限时&#xff0c;为了腾出空间给新的数据&#xff0c;Redis会根据预设的策略来删除一些现有的数据。以下是Redis的几种主要淘汰策略&#xff1a; 1. noeviction&#xff08;默认&#xff09; 描述&#xff1a;不淘汰任何key&#xf…

如何在 IntelliJ IDEA 中为 Spring Boot 应用实现热部署

文章目录 1. 引言2. 准备工作3. 添加必要的依赖4. 配置 IntelliJ IDEA4.1 启用自动编译4.2 开启热部署策略 5. 测试热部署6. 高级技巧7. 注意事项8. 总结 随着现代开发工具的进步&#xff0c;开发者们越来越重视提高生产力的特性。对于 Java 开发者来说&#xff0c;能够在不重启…

Spring Boot中实现JPA多数据源配置指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本文详细介绍了在Spring Boot项目中配置和使用JPA进行多数据源管理的步骤。从引入依赖开始&#xff0c;到配置数据源、创建DataSource bean、定义实体和Repository&#xff0c;最后到配置事务管理器和使用多数据…

如何配置Github并在本地提交代码

前提: 可以流畅访问github, 需要一些上网技巧, 这就自行处理了 申请一个github账号 Github官网地址 首先就是邮箱注册啦, github没有对邮箱的限制, 只要是能收邮件的就ok, qq邮箱, 163等都可以使用. 然后和普通注册账号一样, 一路填写需要的信息, 验证邮箱即可. 如何新增代…

详细聊聊 Spring Cloud for Amazon Web Services

Spring Cloud for Amazon Web Services&#xff08;简称 Spring Cloud AWS&#xff09;是 Spring Cloud 生态系统中用于与亚马逊网络服务&#xff08;AWS&#xff09;集成的一个重要模块。 Spring Cloud AWS 为在 AWS 上构建和部署微服务应用提供了一系列便利的功能和集成点。…

OpenAI 12Days 第二天 强化微调(RFT):推动语言模型在科学研究中的应用

OpenAI 12Days 第二天 强化微调&#xff08;RFT&#xff09;&#xff1a;推动语言模型在科学研究中的应用 文章目录 OpenAI 12Days 第二天 强化微调&#xff08;RFT&#xff09;&#xff1a;推动语言模型在科学研究中的应用RFT的工作原理与应用领域案例研究&#xff1a;基因突变…

21个Python脚本自动执行日常任务(2)

引言 作为编程领域摸爬滚打超过十年的老手&#xff0c;我深刻体会到&#xff0c;自动化那些重复性工作能大大节省我们的时间和精力。 Python以其简洁的语法和功能强大的库支持&#xff0c;成为了编写自动化脚本的首选语言。无论你是专业的程序员&#xff0c;还是希望简化日常工…

关于信号隔离转换器

isolate converter是隔离转换器‌。它是一种在电子电路中用于实现电路隔离、电压转换或信号隔离的设备‌。隔离转换器能在很多场合发挥关键作用&#xff0c;比如可以保护电路、提高安全性&#xff0c;还能帮助不同电压或信号之间的转换与传递‌。 ‌一、产品概述‌ ‌简介‌&a…

2.linux中调度kettle

一.准备转换&#xff0c;等会在linux中用 1.添加excel输入组件&#xff0c;并添加对应的文件 2.添加列拆分为多行组件 3.添加文本文件输出组件 4.保存转换 二.linux安装java 1.把jdk-8u144-linux-x64.tar.gz上传到linux的/lx目录下 2. 解压jdk包&#xff0c;然后配置环境变量…

图的割点、割边(Tarjan算法)

深度优先搜索的利用。 在一个无向连通图中&#xff0c;如果删掉某个顶点后&#xff0c;图不再连通&#xff08;即任意两点之间不能互相到达&#xff09;&#xff0c;我们称这样的顶点为割点。 在一个无向连通图中&#xff0c;如果删掉某条边后&#xff0c;图不在连通&#xff0…