LeetCode刷题--- 验证二叉搜索树

个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客

http://t.csdnimg.cn/ZxuNL个人专栏:力扣递归算法题 http://t.csdnimg.cn/ZxuNL

                  【C++】  http://t.csdnimg.cn/c9twt


前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的  

我讲述题目会把讲解部分分为3个部分:
1、题目解析

2、算法原理思路讲解

3、代码实现


注意:这道题目涉及到二叉搜索树的内容 ,若有不懂的可以参考下面这篇文章 

数据结构:二叉搜索树-CSDN博客


验证二叉搜索树

题目链接:验证二叉搜索树

题目:

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 树中节点数目范围在[1, 104] 内
  • -231 <= Node.val <= 231 - 1

解法

题目解析

题目没什么好说的,就是给我们一颗二叉树,判断它是否为二叉搜索树

二叉搜索树有如下特性:

  • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  • 它的左右子树也分别为二叉搜索树

 算法原理思路讲解   

解法一:

依靠二叉搜索树的特性:中序遍历为有序

思路:创建一个全局变量 v ,中序遍历整个二叉树,然后再判断 v 是否有序即可


解法二:

解法一虽然也可以通过,但是我们没有必要连续插入

思路:

因此,我们可以初始化⼀个⽆穷⼩的全区变量,⽤来记录中序遍历过程中的前驱结点。那么就可以在 中序遍历的过程中,先判断是否和前驱结点构成递增序列,然后修改前驱结点为当前结点,传⼊下⼀层的递归中。

算法流程:
  1. 初始化⼀个全局的变量 prev,⽤来记录中序遍历过程中的前驱结点的 val
  2. 中序遍历的递归函数中:
    (1)设置递归出⼝:root == nullptr 的时候,返回 true;
    (2)先递归判断左⼦树是否是⼆叉搜索树,⽤ left 标记;
    (3)然后判断当前结点是否满⾜⼆叉搜索树的性质,⽤ cur 标记:
                    1)如果当前结点的 val ⼤于 prev,说明满⾜条件,cur 改为 true;
                    2)如果当前结点的 val ⼩于等于 prev,说明不满⾜条件,cur 改为 false;
    (4)最后递归判断右⼦树是否是⼆叉搜索树,⽤ right 标记;
  3. 只有当 left、 cur 和 right 都是 true 的时候,才返回 true。

以上思路就讲解完了,大家可以先自己先做一下 


代码实现

解法一

  • 时间复杂度:O(n),其中 n 为二叉树的节点个数。二叉树的每个节点最多被访问一次,因此时间复杂度为 O(n)。
  • 空间复杂度:O(n),其中 n 为二叉树的节点个数。vector最多存储 n 个节点,因此需要额外的 O(n) 的空间。
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> v;void dfs(TreeNode* root){if (root == nullptr){return;}dfs(root->left);v.push_back(root->val);dfs(root->right);}bool isValidBST(TreeNode* root) {bool flag = true;dfs(root);for (int i = 1; i < v.size(); i++){if (v[i-1] >= v[i]){flag = false;}}return flag;}
};

解法二

  • 时间复杂度:O(n),其中 n 为二叉树的节点个数。在递归调用的时候二叉树的每个节点最多被访问一次,因此时间复杂度为 O(n)。
  • 空间复杂度:O(n),其中 n 为二叉树的节点个数。递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,即二叉树的高度。最坏情况下二叉树为一条链,树的高度为 n ,递归最深达到 n 层,故最坏情况下空间复杂度为 O(n) 。
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {long prev = LONG_MIN;
public:bool isValidBST(TreeNode* root) {if(root == nullptr) return true;bool left = isValidBST(root->left);// 剪枝(可以不用理会,若想知道,自行了解)if(left == false) return false;  // 去掉也可以通过bool cur = false;if(root->val > prev)cur = true;// 剪枝(可以不用理会,若想知道,自行了解)if(cur == false) return false;prev = root->val;bool right = isValidBST(root->right);return left && right && cur;}
};

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

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

相关文章

分享5款不起眼但非常实用的小工具

​ 时光荏苒&#xff0c;科技日新月异&#xff0c;一些看似不起眼的小工具却可能改变我们的工作方式。下面我们将介绍五款不可错过的小工具&#xff0c;它们能给你带来一些意想不到的效果&#xff0c;让你的工作更加高效便捷。 1.音乐播放——洛雪音乐助手 ​ 洛雪音乐助手是…

什么是原子性?

Lindaaker explained that ‘atomic’ comes from Greek and meaning ‘undividable.’ 参考&#xff1a; JavaOne 2012: How Do Non-Blocking Data Structures Work? 参考&#xff1a; JavaOne 2012: How Do Non-Blocking Data Structures Work? 中文翻译 原子&#xff08;…

No module named ‘osgeo’解决办法

from osgeo import gdal 报错&#xff1a;No module named ‘osgeo’ pycharm安装osgeo、GDAL都失败 pip install osgeo失败 最后先下载对应版本的GDAL文件 再cmd命令行中用对应环境的python进行GDAL包安装 1.我将我的Anaconda某个环境文件夹D:\software\pinstall\Anaconda3…

Source Tree回滚 重置 贮藏操作

回滚提交 source tree的回滚提交: 在执行该操作时将会对history中提交的指定节点直接进行回滚,将该节点执行的提交操作撤销(如当前节点是提交文件,执行回滚提交时将会删除该文件,如果当前节点的前面的节点对该节点内容进行修改后,执行回滚提交时需要执行冲突解决),同时生成一次…

【算法集训】基础数据结构:六、栈和队列

做这几天的数据结构的题目的时候有很多函数需要填写&#xff0c;这里需要有一个大致的顺序&#xff0c;一般是先补全结构体&#xff0c;也就是创建队列 | 栈&#xff1b; 而后初始化&#xff0c;设置初值create&#xff08;&#xff09;函数&#xff0c;再然后C语言需要释放&am…

常见的响应状态码

状态码英文描述解释200OK客户端请求成功&#xff0c;即处理成功&#xff0c;这是我们最想看到的状态码302Found指示所请求的资源已移动到由Location响应头给定的 URL&#xff0c;浏览器会自动重新访问到这个页面304Not Modified告诉客户端&#xff0c;你请求的资源至上次取得后…

【MyBatis】拦截查询结果同时动态替换

说明 项目中需要用到响应时替换某些字段的某些值。 代码 package xxx.xxx.xx;import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.cache.CacheKey; import org.apach…

智能优化算法应用:基于蜻蜓算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜻蜓算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜻蜓算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜻蜓算法4.实验参数设定5.算法结果6.参考文献7.MA…

【音视频 | H.264】H.264编码详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

使用FluentAvalonia组件库快速完成Avalonia前端开发

前言 工欲善其事必先利其器,前面我们花了几篇文章介绍了Avalonia框架以及如何在Avalonia框架下面使用PrismAvalonia完成MVV模式的开发。今天我们将介绍一款重磅级的Avalonia前端组件库,里面封装了我们开发中常用的组件,这样就不用我们自己再写组件了。专注业务功能开发,提…

1.4 Postman的安装

hello大家好&#xff0c;本小节我们来安装一下Postman&#xff0c;好为我们后续的测试工作做准备。 首先&#xff0c;打开Postman的官网Postman API Platform 然后根据同学们自己电脑的操作系统来下载对应的Postman安装包。我这里拿windows来举例。我们点击windows的图标 会跳…

Qt 剪贴板操作

Qt剪贴板操作 剪贴板的操作经常和前面所说的拖放技术在一起使用,因此我们现在先来说说剪贴板的相关操作。大家对剪贴板都很熟悉。我们可以简单的把它理解成一个数据的存储池,可以把外面的数据放置进去,也可以把里面的数据取出来。剪贴板是由操作系统维护的,所以这提供了跨…

常见的计算机图片格式

左rgb &#xff08;光源色彩&#xff09; 右cmyk &#xff08;印刷色彩&#xff09; 缺点&#xff0c;不能保存&#xff0c;储存空间太大

我对前端/互联网发展的一些看法

写在前面 看这篇文章的标题你们估计也想到了,我就是单纯的水一篇文章,但是以我的尿性也不可能完全水,毕竟我是一个主打实际的博主,我还是希望通过文章输出一些我对技术或者是生活的一些看法,既然是看法,那么就肯定有很多人持有不同的看法,不过我欢迎任何不同的声音,毕竟我也已经…

螺旋矩阵算法(leetcode第54题)

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。示例 1&#xff1a;输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a;输入&#xff…

工厂设备维护管理有什么比较好的解决方案?有什么好用的工单管理系统?

生产设备对于工厂来说是十分宝贵的资产。一方面&#xff0c;工厂依赖设备进行生产活动&#xff0c;一旦设备故障就会影响产量&#xff1b;另一方面&#xff0c;工厂中的生产设备一般造价都比较高昂&#xff0c;如果出现故障就会增加工厂的生产成本&#xff1b;再一方面&#xf…

SQL Server 服务启动报错:错误1069:由于登录失败而无法启动服务

现象 服务器异常关机以后&#xff0c;SQL Server服务无法启动了。 启动服务时报错&#xff1a; 错误1069:由于登录失败而无法启动服务 解决办法 我的电脑–控制面板–管理工具–服务–右键MSSQLSERVER–属性–登录–登陆身份–选择"本地系统帐户" 设置完成后&am…

JavaSE基础50题:23. 数组拷贝(数组练习题)

文章目录 概述方法一&#xff1a;运用for循环进行拷贝方法二&#xff1a;Java内置方法进行拷贝方法三&#xff1a;指定区间进行拷贝方法四&#xff1a;数组克隆clone() 概述 数组拷贝。 注意&#xff1a; public static void main(String[] args) {int[] array1 {1,2,3,4};Sy…

Trace 在多线程异步体系下传递

JAVA 线程异步常见的实现方式有&#xff1a; new ThreadExecutorService 当然还有其他的&#xff0c;比如fork-join&#xff0c;这些下文会有提及&#xff0c;下面主要针对这两种场景结合 DDTrace 和 Springboot 下进行实践。 引入 DDTrace sdk <properties><java.…

docker容器日志占用磁盘空间过大问题

docker服务运行一段时间后&#xff0c;发现磁盘空间占用很高 其中磁盘占用主要以下目录&#xff1a; /var/lib/docker/containers # 查询占用磁盘较大的文件-升序 du -d1 -h /var/lib/docker/containers | sort -h 控制容器日志大小 法一&#xff1a;容器运行时控制 # max-…