LeetCode 75 —— 98. 验证二叉搜索树

news2024/9/24 0:20:44

LeetCode 75 —— 98. 验证二叉搜索树

一、题目描述:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3]
输出:true
示例 2:

image-20221013160413373

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:

树中节点数目范围在[1, 10^4] 内
-2^31 <= Node.val <= 2^31 - 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/validate-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题目我的思路无非是两种,一种用递归,另一种用栈这种数据结构。

    用递归写起来比较简单,因为是二叉搜索树,要求左子树所有节点都小于根节点,右子树所有节点都大于根节点。所以我们需要进行根节点与其左右节点的比较。

    所以我们可以用一个函数,其初始传入根节点和int64的最小值和最大值作为lower和upper。然后在函数中,我们通过判断当前节点是否大于lower并且小于upper,如果不符合,即return false。然后我们再递归进入root.Left和root.Right。如果是root.Left的话,其lower不变,其upper变成其根节点root的Val。如果是root.Right的话,其upper不变,其lower变成根节点root的Val。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是,刚开始没有将问题合理建模:

    return helper(root.Left,lower,root.Val) && helper(root.Right,root.Val,upper)
    

    这里没有写对,通过重新分析,是先将左边的与lower和根节点的值进行比较,然后再将右边子树的节点与根节点的值和upper进行比较。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    二叉搜索树 **中序遍历 **得到的值构成的序列一定是升序的,这启示我们在中序遍历的时候实时检查当前节点的值是否大于前一个中序遍历到的节点的值即可。

    func isValidBST(root *TreeNode) bool {
        stack := []*TreeNode{}
        inorder := math.MinInt64
        for len(stack) > 0 || root != nil {
            for root != nil {
                stack = append(stack, root)
                root = root.Left
            }
            root = stack[len(stack)-1]
            stack = stack[:len(stack)-1]
            if root.Val <= inorder {
                return false
            }
            inorder = root.Val
            root = root.Right
        }
        return true
    }
    
    作者:LeetCode-Solution
    链接:https://leetcode.cn/problems/validate-binary-search-tree/solution/yan-zheng-er-cha-sou-suo-shu-by-leetcode-solution/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

三、AC 代码:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isValidBST(root *TreeNode) bool {
    return helper(root,math.MinInt64,math.MaxInt64)
}

func helper(root *TreeNode,lower, upper int) bool {
    if root == nil {
        return true
    }

    if root.Val >= upper || root.Val <= lower{
        return false
    }

    return helper(root.Left,lower,root.Val) && helper(root.Right,root.Val,upper)
} 

四、总结:

递归的时间复杂度和空间复杂度都是O(n),使用栈,也就是中序遍历的空间复杂度和时间复杂度都是O(n)。

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

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

相关文章

【MYSQL高级】Mysql的SQL性能分析【借助EXPLAIN分析】

性能分析 要说sql有问题&#xff0c;需要拿出证据&#xff0c;因此需要性能分析 Mysql查询优化器&#xff08;Mysql Query Optimizer&#xff09; Mysql中有专门负责优化SELECT语句的优化器模块&#xff0c;主要功能&#xff1a;通过计算分析系统中收集到的统计信息&#xf…

Mali Offline Compiler - 官方视频教学 - 笔录

文章目录 目的Mali Offline Compiler 使用实例视频分析 shadermalioc 命令制定你想要分析的 shader制定你想要分析的着色器对应的 GPU实例解析内容硬件结构 & 驱动 & Shader 类型信息寄存器、是否堆溢出、16-bit 算术占比寄存器的使用量减少浮点精度优化堆溢出与否16-b…

基于Java+vue前后端分离学习交流论坛设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

easyExcel实现动态导出需要的字段列

easyExcel实现动态导出需要的字段列 实体概况 package excel;import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.…

C++学习笔记-第11单元 标准模板库介绍

第11单元 标准模板库介绍 文章目录 第11单元 标准模板库介绍单元导读11.1 标准模板库(STL)基础11.2 STL容器简介11.3 STL迭代器简介11.3.1 使用迭代器访问容器中的元素11.3.2 迭代器类型11.3.3 迭代器支持的运算符操作 11.4 顺序容器11.4.1 顺序容器的逻辑结构11.4.2 代码展示s…

Vue组件库Element-快速入门

目录 什么是Element 快速入门 什么是Element Element&#xff1a;是饿了么团队研发的&#xff0c;一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库组件&#xff1a;组成网页的部件&#xff0c;例如超链接、按钮、图片、表单、表格、分页条等官网&#xff1a;…

avoidLabelOverlap无效果,echarts环形标签重叠,echarts数据重叠

在开发echarts环形图时,会出现数据重叠的现象.比如下面这情况.不可能为了数据将环形图变得太小,这样环形图太小也不美观.后来在官网上查找有一个avoidLabelOverlap属性,结果加上去后也没啥用 解决方法: 除了加上面:avoidLabelOverlap:true以外,还要加另外一个属性:minAngle:1…

win10系统中Pensieve(Sigcomm17)算法部署与运行

win10系统中Pensieve算法部署与运行 一、环境配置1、Anaconda环境配置2、Pycharm安装3、Pensieve安装包配置4、Pensieve数据集生成5、Pensieve代码运行6、Pensieve代码修改 一、环境配置 1、Anaconda环境配置 下载并且安装 Anaconda 官网下载地址&#xff1a;https://www.ana…

【Java基础教程】(六)程序概念篇 · 末:全面讲解Java方法的定义及应用、方法重载及递归~

Java基础教程之程序概念 末 本节学习目标1️⃣ 方法的定义与使用1.1 概念&#x1f50d; 在编写代码时&#xff0c;怎么判断什么情况下应该定义方法? 1.2 方法重载1.3 方法递归 &#x1f33e; 总结 本节学习目标 掌握Java中方法的定义结构、方法重载的概念与应用&#xff1b;…

EulerOS2.0SP10操作系统Esxi虚拟机安装手记

本文记录了在 Esxi7.0平台上新建虚拟机安装华为EulerOS2.0SP10国产操作系统的过程&#xff0c;仅供参考。 一、新建虚拟机 1、在VCenter上选中集群&#xff0c;右键选择新建虚拟机 2、在新建虚拟机视图点NEXT 3、输入虚拟机名称&#xff08;自定义&#xff09;&#xff0c;选…

Apikit 自学日记:如何引用全局变量

引用全局变量 一、什么是全局变量 全局变量可以在测试过程中动态取值以及赋值&#xff0c;比如&#xff1a;使用登录接口获取 token&#xff0c;将 token 值赋值给自定义全局变量 global_token&#xff0c;然后在另一个需要使用该token的接口中&#xff0c;使用 {{global_toke…

css,less,scss中的深度选择器,结合elementUi使用

css中深度选择器用到的是 >>>加类名 可以很方便的找到自己想要修改的样式 lees中用到 /deep/ 加类名 scss中用到::v-deep 加类名

【软件工具使用体验NFC】读取nfc里的内容和写入nfc的内容 tagInfo和TagWritter两款软件的使用和下载

教程目录 教程简介所需环境和版本资源免费下载执行过程tagInfo的使用&#xff1a;tagWritter的使用&#xff1a;my dataset的解释&#xff1a; 结束语 教程简介 这篇内容主要是前段时间开发了一个小程序的时候涉及到了通过小程序读写nfc标签的内容&#xff0c;当时还特地和我们…

特征模型仿真例1:参数辨识

题目 考虑被控对象 G ( s ) 3 s 4 s 4 5 s 3 10 s 2 6 s 4 G(s)\frac{3 s4}{s^{4}5 s^{3}10 s^{2}6 s4} G(s)s45s310s26s43s4​ 和特征模型 y ( k ) ϕ T ( k − 1 ) θ ( k ) y(k)\boldsymbol{\phi}^{\mathrm{T}}(k-1)\boldsymbol{\theta}(k) y(k)ϕT(k−1)θ(k) 其…

谁告诉我这是什么文件,怎么了?活不起了?得靠这个冲业绩?

TIM 从一年前就卸载了&#xff0c;今天整理磁盘才发现还有这么多文件&#xff0c;想着没什么用直接删掉得了&#xff0c;没想到他娘的死活删不掉&#xff0c;好多文件一个一个删才找到这玩意&#xff0c;所有能查找运行程序的地方都找遍了&#xff0c;死活没找到在哪打开了&…

第一章 系统服务监控-SpringBootAdmin

前言 本来想用一节就写完SpringBootAdmin的&#xff0c;但随着研究的深入发现一节应该是不够的&#xff0c;网上的资料也不会非常系统&#xff0c;官网的例子有些已经好几年没更新了&#xff0c;所以接下来还是系统性的来写下吧 第一节 完成基础配置&#xff0c;暴露所有端点…

​如何从任何地方访问办公室电脑?

​远程办公已然成为了一种常见的办公方式&#xff0c;在远程工作期间访问办公室电脑获取必要的文件或信息非常重要。与远程访问同一网络中的电脑不同&#xff0c;使用Windows远程桌面从外部访问办公室电脑需要进行端口转发。对于很多人来说&#xff0c;端口转发可能有点复杂。那…

SpringBoot整合RestTemplate用法讲解(完整详细)

前言&#xff1a;本篇主要介绍了RestTemplate中的GET&#xff0c;POST&#xff0c;PUT&#xff0c;DELETE、文件上传和文件下载6大常用的功能&#xff0c;每一个方法和每一行代码都进行了详细的讲解&#xff0c;代码都是亲自测试过的&#xff0c;整篇博客写完以后自己也是受益匪…

缓存穿透、缓存击穿、缓存雪崩详解以及解决方案

缓存穿透、缓存击穿、缓存雪崩详解以及解决方案 一。缓存穿透 查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都查数据库 方案一&#xff1a; 方案二&#xff1a; 二。缓存击穿 给某一个key设置了过期时间&#xff0…

Mongdb之Robo3T

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;MyBatis详解 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪发光的…