【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.mzph.cn/news/800854.shtml

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

相关文章

2024mathorcup妈妈杯数学建模A题思路模型

2024mathorcup妈妈杯数学建模A题思路模型:比赛开始后第一时间更新,更新见文末名片,下面对2022年B题进行介绍: 2022Mathorcup B题题目介绍 ​ B题无人仓的搬运机器人调度问题本题考在无人仓内的仓库管理问题之一,搬运机…

Python 描述符

文章目录 类型:数据描述符:方法描述符:描述符的要包括以下几点:方法描述符实现缓存 描述符(Descriptor)是 Python 中一个非常强大的特性,它允许我们自定义属性的访问行为。使用描述符,我们可以创建一些特殊的属性,在访问这些属性时执行自定义…

机场数据治理系列介绍(5)民用机场智慧能源系统评价体系设计

目录 一、背景 二、体系设计 1、评价体系设计维度 2、评价体系相关约定 3、评价指标体系框架设计 4、能源利用评价指标 5、环境友好评价指标 6、智慧管控评价指标 7、安全保障评价指标 三、具体落地措施 一、背景 在“双碳”国策之下,各类机场将能源系统建…

es6:set()和weakset()

一、Map() 1.1 简介 ES6 提供了 Set 数据结构&#xff0c;它类似于数组&#xff0c;但是值是唯一没有重复的。 我们可以通过 new Set()去创建它。 1.2. Set的创建、设置与获取 <script> const set new Set(); console.log(set.add(1)); //Set { 1 } …

linux常用指令(一)——mv、rm、which、find

mv命令&#xff1a; 用于查看文件内容 语法&#xff1a;mv 参数1 参数2 参数1&#xff0c;linux路径&#xff0c;表示被移动的文件或文件夹 参数2&#xff0c;linux路径&#xff0c;表示要移动去的地方&#xff0c;如果目标不存在&#xff0c;则进行改名 rm命令&#xff1a…

题目 3158: 三国游戏

题目描述: 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件&#xff0c;每个事件之间相互独立且最多只会发生一次&#xff0c;当第 i 个事件发生时会分别让 X, Y, Z 增加Ai , Bi ,Ci 。 当游戏…

深入解析template,掌握C++模板的精髓!

掌握C模板&#xff08;template&#xff09;的优雅之道&#xff01; 一、什么是模板&#xff1f;二、模板如何工作&#xff1f;三、C 中的模板类型3.1、 类模板3.2、 函数模板 四、模板参数推导4.1、模板参数推导示例4.2、函数模板参数推导4.3、类模板参数推导&#xff08;C17 …

2024年MathorCup妈妈杯数学建模思路C题思路解析+参考成品

1 赛题思路 (赛题出来以后第一时间在群内分享&#xff0c;点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间&#xff1a;2024年4月11日&#xff08;周四&#xff09;12:00 比赛开始时间&#xff1a;2024年4月12日&#xff08;周五&#xff09;8:00 比赛结束时间&…

GPU部署ChatGLM3

首先&#xff0c;检查一下自己的电脑有没有CUDA环境&#xff0c;没有的话&#xff0c;去安装一个。我的电脑是4060显卡&#xff0c;买回来就自带这些环境了。没有显卡的话&#xff0c;也不要紧&#xff0c;这个懒人安装包支持CPU运行&#xff0c;会自动识别没有GPU&#xff0c;…

北京注销公司不同情况下的注销流程与所需材料

在北京&#xff0c;企业注销是一个相对复杂的过程&#xff0c;涉及到多种情况和不同的材料要求。本文将为您详细解析北京注销公司的不同情况及其所需材料&#xff0c;帮助您更好地了解并完成企业注销流程。本人从事工商行业多年&#xff0c;如果您想要注销自己的公司&#xff0…

启明智显M4核心板驱动17寸屏 为您打造无与伦比的视觉盛宴

近日&#xff0c;启明智显推出M4核心板驱动17寸屏&#xff0c;8 Link LVDS接口下1280*1024分辨率为用户展现了超强的视觉体验。 M4核心板采用纯国产架构&#xff0c;内置了16位DDR内存&#xff0c;为设备提供强大的数据处理能力和高效的运行速度。无论是处理复杂的任务还是进…

zookeeper C API client 如何设置digest鉴权验证

本文参考地址 zkCli.sh如何设置 自带的命令行客户端设置比较简单 增加授权用户。addauth digest root:111 其中digest是scheme&#xff0c;root:111是id (credential&#xff0c;root可以理解为明文用户&#xff0c;111可以理解为明文密码) :perm 2.为特定目录设置权限。 se…

【简单讲解下C++max函数的使用】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【WRF】将modis数据2019年中国土地利用数据处理成wrf能识别的土地利用数据

step1、利用gee获取2020年中国区域的土地利用数据 //get a feature collection with china square boundary var china_square = ee.FeatureCollection(projects/hsy/assets/chinashp_square);//load modis land cover data var modisLand = ee.ImageCollection(MODIS/006/MCD1…

Java | Leetcode Java题解之第13题罗马数字转整数

题目&#xff1a; 题解&#xff1a; class Solution {Map<Character, Integer> symbolValues new HashMap<Character, Integer>() {{put(I, 1);put(V, 5);put(X, 10);put(L, 50);put(C, 100);put(D, 500);put(M, 1000);}};public int romanToInt(String s) {int …

docker-相关

打镜像 1、编写dockfile文件&#xff0c;请自行百度 2、docker build -t 镜像名称:版本号 dockerFile路径 3、docker save -o 镜像压缩包名称.tar 镜像名称:镜像版本号 部署镜像 1、将镜像tar包放到部署机器上 2、加载镜像&#xff1a;docker load -i 镜像tar包路径 3、dock…

考研数学|刷题用汤家凤《1800》还是张宇《1000》?看完这篇你就懂了

考研数学的复习是一个系统的过程&#xff0c;不同的习题集有各自的特点和适用场景。汤家凤的1800题和张宇的1000题都是非常受欢迎的考研数学复习资料&#xff0c;它们各有侧重点和优势。 汤家凤的1800题以其全面性和基础性著称&#xff0c;题目覆盖了考研数学的各个知识点&…

缓存穿透问题

缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的两种解决方案&#xff1a; 1.缓存空对象 优点&#xff1a;实现简单&#xff0c;维护方便 缺点&#xff1a;占用…

Ubuntu中apt使用

搜索 apt-cache search <package> 列出与<package>名称相匹配的包 安装 apt-get install <package> apt-get --reinstall install packagename 修复或者只安装最新版本 移除 apt-get remove [–purge] <package> apt-get -…

【40分钟速成智能风控4】传统风险管理体系

目录 人工审核 纸质材料评估 电话回访 线下走访尽调 专家模型 业务规则库 专家调查权重法 熵权法 随着大数据和机器学习技术的发展与成熟&#xff0c;智能风控已经逐步取代传统风控&#xff0c;成为国内互联网金融机构主流的风险管理模式。一方面&#xff0c;传统风控是…