验证搜索二叉树

目录

题目

方法一

思路

优化

方法二

思维误区

递归关系推导

代码实现


题目

98. 验证二叉搜索树       

难度:中等

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

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

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

示例 1:

 

 输入:root = [2,1,3]

 输出:true

示例 2: 

输入:root = [5,1,4,null,null,3,6] 

输出:false

解释:根节点的值是 5 ,但是右子节点的值是 4 。 

方法一

思路

我们知道一个二叉搜索树的中序遍历得到的序列一定是升序的。那么我们直接中序遍历二叉树,将每个结点的值保存,然后判断得到的序列是否升序即可。这种方法的时间复杂度和空间复杂度均为O(n)。

Q:为什么中序遍历一颗二叉树得到升序序列可以证明这颗树是二叉搜索树?

A:二叉搜索树的定义是:对于树中的每个节点,它的左子树中的所有节点的值都小于该节点的值,而它的右子树中的所有节点的值都大于该节点的值。这个特性保证了二叉搜索树在结构上有序。而中序遍历二叉树的顺序是:先遍历左子树,然后访问根节点,最后遍历右子树。由于二叉搜索树的左子树节点值小于根节点,右子树节点值大于根节点,因此中序遍历二叉搜索树的结果会是一个升序序列。反过来,如果中序遍历一颗二叉树得到的是升序序列,那么这颗树的每个节点的左子树节点值都小于它,右子树节点值都大于它,这符合二叉搜索树的定义。

A:当访问任意节点A时,肯定已经先访问了A的左子树,因为得到的是升序序列,此时A的值大于左子树所有的值,A和左子树满足二叉搜索树的定义,同理A和右子树满足二叉搜索树的定义,所以以A为根节点数是二叉搜索树。所以这颗树满足二叉搜索树的定义,是一颗二叉搜索树。

优化

这个算法还可进一步优化,判断输出序列是否升序仅需检查当前节点的值是否大于前一个中序遍历到的节点的值即可。所以我们仅需保存上一个结点的值即可。这种方法的时间复杂度为O(n),时间复杂度均为O(1) (忽略函数调用栈空间)。

这种方法很容易想到,实现也很容易,在此我们不具体实现。如果大家对二叉树的遍历不熟悉,可以参考我的往期博客:二叉树的遍历。

方法二

思维误区

通过搜索二叉树的性质:对于树中的每个节点,它的左子节点值小于该节点的值,而它的右子节点的值大于该节点的值。我们很容易想出一个递归算法,即递归判断每个结点的左子结点和右子结点,判断他们是否小于或大于父节点的值。如果所有结点都符合条件,则该树为二叉搜索树。

其实这是一个经典的思维误区,我们举一个反例:

对于这颗树它的树中的每个节点,它的左子节点值小于父节点的值,而它的右子节点的值大于该节点的值。但他并不是一个二叉搜索树。

为什么呢?因为二叉搜索树定义中

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。

 也就是说每个结点的左子节点的上界为当前节点,右子节点的下界为当前节点。同时他们还需要有一个下界/上界,保证他们符合二叉搜素树的定义。

那么我们现在只要知道左子节点的下界,右子节点的上界。就可以得出递归关系,进行递归判断。

递归关系推导

对于二叉树中的结点(除根节点,与其左右结点)都可概括为以下四种类型:

我们先分析C作为B左子树的两种情况:

情况一:

 情况二:

上界:对于这两种情况 ,C 都要小于 B ,即 C 的上界为 B。

下界:情况一下,C 的下界为负无穷。B的下届也为负无穷。即 C 的下界为 B 的下界。情况二下,C 必须小于 A,即 C的下界为A。B的下界也为A, 即 C 的下界为 B 的下界.

综上可得:当前结点的左子节点的上界为当前节点,下界为当前节点的下界。

C作为B右子树的两种情况:

情况一:

情况二:

上界: 情况一下,C 的上界为正无穷。B的上界届也为正无穷。即 C 的上界为 B 的上界。情况二下,C 必须小于A,即 C的上界为A。B的上界也为A, 即 C 的上界为 B 的上界.

下界:对于这两种情况 ,C 都要大于 B ,即 C 的下界为 B。

 综上可得:当前结点的右子节点的下界为当前节点,上界为当前节点的上界。

代码实现

现在我们得到了递归关系,只需递归判断左右子树即可。

代码如下:

class Solution {
public:bool istrue(TreeNode* root,long long min,long long max){if(!root) return true;if(root->val<=min || root->val>=max){return false;}return istrue(root->left,min,root->val) && istrue(root->right,root->val,max);//[min,root->val] [root->val,max]}bool isValidBST(TreeNode* root) {return istrue(root,LONG_MIN,LONG_MAX);}
};

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

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

相关文章

家电无缝连接的奥秘—通过酷开系统实现智能家居互联互通

智能家居是消费升级与技术升级的共同产物&#xff0c;是时代发展的必然结果&#xff0c;日渐深入人心也是大势所趋。酷开科技智慧AI&#xff0c;让智慧家居成为生活中的一部分&#xff0c;以酷开系统为中心&#xff0c;实现家庭内智能家居的连接&#xff0c;并可通过酷开系统进…

【教学类-55-03】20240512图层顺序挑战(三角形版)(6块三角形,420种叠放顺序)

作品展示 背景需求 分享Lab&#xff5c;更新啦&#xff5e;图层顺序挑战游戏 - 小红书 (xiaohongshu.com)https://www.xiaohongshu.com/discovery/item/62f21760000000000900ec6d?app_platformandroid&ignoreEngagetrue&app_version8.35.0&share_from_user_hidde…

【c++】set、map用法详解

set、map用法详解 1. 关联式容器2. 键值对2.1 &#xff1a;pair2.2&#xff1a;make_pair 3. 树形结构的关联式容器3.1&#xff1a;set构造函数find()erase()insert()count()lower_bound()upper_bound() 3.2&#xff1a;multiset3.3&#xff1a;map构造函数insert()operator[] …

【数据结构】浅谈

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 目录 一、概念&#xff1a; 二、物理结构&#xff1a; 1、顺序存储结构&#xff1a; 2、链式存储结构&#xff1a; 3、数据索引存储结构: 4、数据散列存储结构&#xf…

现代制造之Cura切片

现代制造 有现代技术支撑的制造业&#xff0c;即无论是制造还是服务行业&#xff0c;添了现代两个字不过是因为有了现代科学技术的支撑&#xff0c;如发达的通信方式&#xff0c;不断发展的互联网&#xff0c;信息化程度加强了&#xff0c;因此可以为这两个行业增加了不少优势…

手把手教你用 spacy3 训练中文NER

文章目录 模型文件下载训练模型准备数据转化成 doc_bin 格式模型训练配置生成初始配置补全完整配置 开始训练 测试模型参考文献 模型文件下载 https://github.com/explosion/spacy-models/releases?qzh&expandedtrue 简单测试一下ner效果&#xff0c;发现根本不能用 训…

关于‘==’与equals的区别

我写的也不清楚&#xff0c;有兴趣的可以看这位大佬的文章链接&#xff0c;说的很清楚 https://www.cnblogs.com/Latiny/p/8099581.html#!comments 与 equals 方法 判断两个变量是否相等有两种方式&#xff1a;一种是利用 运算符&#xff0c;另一种是利用equals方法。 注意…

C#语音播报(通过CoreAudioAPI完成对扬声器的控制)

1&#xff0c;效果&#xff1a; 作用&#xff1a; 可对当前内容&#xff08;例如此例中的重量信息&#xff09;进行语音合成播报 。可设置系统扬声器音量与状态(是否静音),同时根据扬声器状态同步更新当前控件状态与值&#xff0c;实现强制PC扬声器按照指定的音量进行播报&…

MATLAB的Bar3函数调节渐变色(内附渐变色库.mat及.m文件免费下载链接)

一. colormap函数 可以使用colormap函数&#xff1a; t1[281.1,584.6, 884.3,1182.9,1485.2; 291.6,592.6,896,1197.75,1497.33; 293.8,596.4,898.6,1204.4,1506.4; 295.8,598,904.4,1209.0,1514.6];bar3(t1,1) set(gca,XTickLabel,{300,600,900,1200,1500},FontSize,10) set…

智慧园区能耗管控系统,3D可视化开发都需要哪些技术栈?

数据可视化&#xff1a; 数据可视化是将数据通过图表、图形、地图等可视化方式展示&#xff0c;使得数据更加直观、易于理解和分析。在智慧园区能耗管控系统中&#xff0c;可以使用各种图表库&#xff08;如Echarts、Highcharts&#xff09;和可视化工具&#xff08;如Tableau…

MES系统与WMS集成方法(满分100学习资料)

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 这份文件是关于MES系…

常见排序算法——希尔排序

基本原理 希尔排序在插入排序的基础之上&#xff0c;将待排序序列分成组&#xff0c;分成 gap 个组&#xff0c;组的数量通过 length / 2 获得&#xff0c;比如6个元素的序列&#xff0c;那么就是 3 个组&#xff0c;每个组两个元素&#xff0c;然后将每个组的元素进行插入排…

ECharts系列:基本使用及配置项

目录 基本使用 配置项的写法与位置 配置项option包含属性 各个配置项属性大全 基本使用 在阅读本篇文章时请参考ECharts官网地址中的内容配合了解 首先我们知道ECharts图表中有许多类型&#xff0c;如折线图、柱状图、饼形图等&#xff0c;下面我以折线图为例讲解ECharts图…

文本检测模型 DBNet 一种基于分割算法的模型 对每个像素点进行自适应二值化,并将二值化过程与网络训练相结合 可微分二值化模块 概率图

文本检测模型 DBNet DBNet文本检测模型是一种基于分割算法的模型,其优化之处在于对每个像素点进行自适应二值化,并将二值化过程与网络训练相结合。 传统的文本检测方法通常将二值化作为一个后处理步骤,与网络训练分开进行。而DBNet则提出了一种可微分的二值化方法,即将文…

【全开源】Java同城预约月嫂服务上门服务本地服务源码APP+小程序+公众号+H5

特色功能&#xff1a; 预约服务&#xff1a;用户可以通过小程序在线预约月嫂服务&#xff0c;选择服务时间、服务类型、月嫂等信息&#xff0c;实现方便快捷的预约流程。在线咨询&#xff1a;用户可以通过小程序向月嫂或服务机构咨询相关问题&#xff0c;获得专业的解答和建议…

Linux修炼之路之基础指令(2)+shell命令及运行原理

目录 一&#xff1a;基础指令 7.rm指令 和 rmdir指令 8.*通配符 9.man指令 10.echo指令 11.cat 指令 12.cp 指令 13.mv指令 14.alias 指令 15.less more head tail wc-l 指令 16.date 时间相关的指令 17.cal指令 18. find which whereis 三个查找文件指令…

【全开源】Java俱乐部系统社区论坛商城系统源码-奔驰奥迪保时捷大众宝马等汽车俱乐部

特色功能&#xff1a; 会员中心&#xff1a;会员中心可以帮助企业更好地管理客户&#xff0c;包括设置积分商城、会员卡充值、个人汽车档案等功能&#xff0c;对不同的会员群体展开有针对性的营销&#xff0c;并维护和积累自己的粉丝群体。信息服务&#xff1a;负责定期发布新…

关于在ubuntu18.04中运行ORB_SLAM3时遇到的报错:段错误(核心已转储)的解决方法(踩坑记录)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、段错误&#xff08;核心已转储&#xff09;1. 已放弃(核心已转储)(1) 问题描述(2)原因分析 二、解决方法1. 解决方法一2. 解决方法二 总结 一、段错误&#xff…

【硬件模块】ESP-01SWiFi模块基于AT指令详解(WiFi,TCP/IP,MQTT)

ESP-01S ESP-01S是由安信可科技开发的一款Wi-Fi模块。其核心处理器是ESP8266&#xff0c;该处理器在较小尺寸的封装中集成了业界领先的Tensilica L106超低功耗32位微型MCU&#xff0c;带有16位精简模式&#xff0c;主频支持80MHz和160MHz&#xff0c;并集成了Wi-Fi MAC/BB/RF/P…

Django性能之道:缓存应用与优化实战

title: Django性能之道&#xff1a;缓存应用与优化实战 date: 2024/5/11 18:34:22 updated: 2024/5/11 18:34:22 categories: 后端开发 tags: 缓存系统Redis优点Memcached优缺点Django缓存数据库优化性能监控安全实践 引言 在当今的互联网时代&#xff0c;用户对网站和应用…