【Leetcode每日一题】 递归 - 验证二叉搜索树(难度⭐⭐)(53)

1. 题目解析

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

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

中序遍历是二叉树遍历中的一种重要方式,它按照左子树、根节点、右子树的顺序访问每个节点。这种方式特别常用于二叉搜索树的验证和相关题目中。二叉搜索树有一个特殊的性质:其中序遍历的结果一定是一个严格递增的序列。

想要验证一棵二叉树是否为二叉搜索树,我们可以借助中序遍历。在遍历的过程中,我们可以记录当前访问节点的前驱节点的值,并与当前节点的值进行比较,以确保它们是递增的。

下面是一个简单的算法流程,帮助我们理解这个过程:

  1. 初始化前驱节点值
    在开始遍历之前,我们需要一个变量prev来记录中序遍历中前驱节点的值。这个变量在开始时可以设置为一个无穷小的值,因为我们希望从最小的值开始比较。

  2. 定义中序遍历的递归函数
    这个函数会接收当前遍历的节点root作为参数。

    • 递归出口
      如果当前节点root为空(即已经遍历到了叶子节点的下方),则返回true,表示这一部分子树是满足二叉搜索树条件的。

    • 递归判断左子树
      首先,我们需要递归地判断左子树是否为二叉搜索树。我们可以使用一个变量retleft来标记左子树的验证结果。

    • 判断当前节点
      接下来,我们要判断当前节点是否满足二叉搜索树的性质。如果当前节点的值大于prev(即当前值大于前一个访问的节点的值),那么说明当前节点满足条件,我们可以将retcur标记为true;如果当前节点的值小于等于prev,则说明不满足条件,将retcur标记为false

    • 更新前驱节点值
      在判断完当前节点后,我们需要更新prev的值为当前节点的值,以便在遍历下一个节点时进行比较。

    • 递归判断右子树
      最后,我们需要递归地判断右子树是否为二叉搜索树,并使用retright来标记右子树的验证结果。

  3. 汇总结果
    只有当左子树、当前节点和右子树都满足二叉搜索树的性质(即retleftretcurretright都为true)时,我们才能说整棵树是一个二叉搜索树,并返回true。否则,返回false

通过这种方式,我们可以有效地利用中序遍历来验证一棵二叉树是否为二叉搜索树。这种方法不仅逻辑清晰,而且在实际应用中也非常有效。

3.代码编写

/*** 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) return true;bool left = isValidBST(root->left);//判断左子树是二souif(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;}
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~ 

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

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

相关文章

Linux从入门到精通 --- 4(下).网络请求和下载、端口、进程管理、主机状态监控、环境变量、文件的上传和下载、压缩和解压

文章目录 第四章(下):4.8 网络请求和下载4.8.1 ping4.8.2 wget4.8.3 curl 4.9 端口4.9.1 查看端口占用 4.10 进程管理4.10.1 查看进程4.10.2 查看指定进程4.10.3 关闭进程 4.11 主机状态监控4.11.1 查看系统资源占用4.11.2 top交互式选项4.11.3 磁盘信息监控4.11.4 …

【简单讲解下Lisp的学习历程】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

【优选算法专栏】专题十六:BFS解决最短路问题(二)

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小…

7.1.4 Selenium 爬取京东商品信息实战

目录 1、实战内容 2、思路 3、分析 url 4、开始操作 1、得到 Cookies 2、访问页面,得到 response 3、解析页面 4、存入 MySQL 5、1-3步总代码 1、实战内容 爬取京东笔记本电脑商品的信息(如:价格、商品名、评论数量),存入 MySQL 中…

使用 AI 生成正则表达式,告别正则烦恼

如果你有处理正则表达式的需求,那么这个网站(autoregex.xyz)一定要收藏好。 可以根据文字描述生成正则表达式。 默认是从文字到正则,不用选择。 输入框中输入描述,点击 ”GO“ 按钮。 等待一会儿,即可生…

数据结构与算法:哈希表

目录 1.哈希表和哈希 1.1.知识引入 1.2.为什么需要哈希表呢? 2.简易的哈希表 2.1.哈希表的基础结构 2.2.如何实现基础的哈希表 2.2.1.增 2.2.2.删 2.2.3.查 2.3.泛型编程下的哈希表 3.简易的哈希桶 1.哈希表和哈希 1.1.知识引入 哈希表(Hash …

11-新热文章-实时计算

热点文章-实时计算 1 今日内容 1.1 定时计算与实时计算 1.2 今日内容 kafkaStream 什么是流式计算 kafkaStream概述 kafkaStream入门案例 Springboot集成kafkaStream 实时计算 用户行为发送消息 kafkaStream聚合处理消息 更新文章行为数量 替换热点文章数据 2 实时…

网络通信三要素:IP、端口和协议

IP:设备在网络中的地址,是唯一的标识 IP:全程”互联网协议地址“,是分配给上网设备的唯一标志 IP地址有两种形式: IPv4:32位 IPv6:共128位。分成8段表示,每取四位编码成一个16进制…

Linux 5.10 Pstore 功能测试

目录 简介环境配置内核配置参考备注 简介 Pstore(Persistent store support)是用于系统发生oops或panic时,自动保存内核log buffer中的日志。随着功能不断完善,Duo S使用Linux 5.10已经支持保存console日志、ftrace消息和用户空间日志的收集&#xff0c…

Python学习从0开始——007输入与输出

Python学习从0开始——007输入与输出 一、简单输出二、复杂输出2.1引用变量2.2format()函数2.3手动格式化 三、读写文件3.1open()3.2操作文件对象3.3使用 json 保存结构化数据 一、简单输出 str() 函数返回供人阅读的值,repr() 则生成适于解释器读取的值&#xff0…

德兰梅尔:耐高温热销的膜元件亮相2024上海国际生物发酵展

德兰梅尔:耐高温热销的膜元件盛装亮相2024上海国际生物发酵展,8月7-9号上海新国际博览中心与您不见不散! 据了解,从成立至今,德兰梅尔一直专注膜技术、膜产品的开发生产。在中国市场上,德兰梅尔刚步入中国…

峥嵘九载,逐云而上:青果乔迁新址,乘风破浪再起新篇

4月1日,近百名员工和诸多合作伙伴齐聚,共同见证了青果九周年庆典暨乔迁仪式这一里程碑式的时刻。 新起点,新征程,再启航! 以新为序,共赴新征程 在典礼上,青果创始人和高管分别发表了致辞&#…