力扣第98题 验证二叉搜索树 c++ 与上一篇文章相似

题目

98. 验证二叉搜索树

中等

相关标签

树  深度优先搜索  二叉搜索树  二叉树

给你一个二叉树的根节点 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

思路和解题方法

第一种方法:

  • 首先定义一个辅助函数 traversal,用于实现中序遍历二叉树,并将节点值存储在一个数组 vec 中。
  • 然后,调用 traversal 函数来遍历二叉树并按顺序存储节点值。
  • 最后,检查数组 vec 是否按照升序排列,若是则为合法的二叉搜索树,返回 true;否则返回 false。

第二种方法:

  • 定义一个全局变量 maxVal,初始值设为 LONG_MIN
  • 使用递归函数 isValidBST 对二叉树进行深度优先搜索。
  • 在搜索过程中,先递归遍历左子树,然后判断当前节点的值是否大于 maxVal,若是则更新 maxVal 为当前节点的值,表示已经访问了当前节点,继续遍历右子树。
  • 若出现当前节点的值小于等于 maxVal,则说明不满足二叉搜索树的要求,返回 false。
  • 如果整个搜索过程中没有出现不满足要求的情况,即二叉树是合法的二叉搜索树,返回 true。

第三种方法:

  • 定义一个指针 pre 用于记录前一个访问的节点。
  • 使用递归函数 isValidBST 对二叉树进行中序遍历。
  • 在中序遍历过程中,先递归遍历左子树,然后判断当前节点的值是否大于前一个节点的值,若不满足这个条件则返回 false。
  • 如果整个中序遍历过程中都满足当前节点值大于前一个节点值的条件,则说明二叉树是合法的二叉搜索树,返回 true。

复杂度

        时间复杂度:

                O(n)

时间复杂度:O(n),其中 nnn 为二叉树的节点个数。二叉树的每个节点最多被访问一次,因此时间复杂度为 O(n)。

        空间复杂度

                O(n)

空间复杂度:O(n),其中 nnn 为二叉树的节点个数。栈最多存储 nnn 个节点,因此需要额外的 O(n)的空间。

c++ 代码一

// 中序遍历二叉树,将节点值按顺序存储在vec数组中
void traversal(TreeNode* root) {if(root == NULL) return ;// 遍历左子树traversal(root->left);// 将当前节点值加入数组vec.push_back(root->val);// 遍历右子树traversal(root->right);
}bool isValidBST(TreeNode* root) {// 清空数组vec.clear();// 进行中序遍历traversal(root);// 检查数组是否按升序排列for(int i = 1; i < vec.size(); i++) {// 若出现逆序,则不是二叉搜索树if(vec[i] <= vec[i-1]) return false;}// 数组按升序排列,是二叉搜索树return true;
}

c++代码二

long long maxVal = LONG_MIN; // 因为后台测试数据中有int最小值bool isValidBST(TreeNode* root) {// 到达叶节点,返回true,表示是一个合法的搜索二叉树if(root == NULL) return true;// 先递归处理左子树bool left = isValidBST(root->left);// 判断当前节点值是否大于maxValif(maxVal < root->val) maxVal = root->val;else return false;// 再递归处理右子树bool right = isValidBST(root->right);// 左右子树都是合法的搜索二叉树,整棵树才是合法的return left && right;
}

c++代码三

TreeNode* pre = NULL; // 用来记录前一个节点bool isValidBST(TreeNode* root) {// 到达叶节点,返回true,表示是一个合法的搜索二叉树if(root == NULL) return true;// 先递归处理左子树bool left = isValidBST(root->left);// 判断当前节点的值是否大于等于前一个节点的值if(pre != NULL && pre->val >= root->val)return false;// 更新pre指针为当前节点pre = root;// 再递归处理右子树bool right = isValidBST(root->right);// 左右子树都是合法的搜索二叉树,整棵树才是合法的return left && right;
}

c++迭代法

class Solution {
public:bool isValidBST(TreeNode* root) {stack<TreeNode*> st;  // 创建一个栈用于存储节点TreeNode* cur = root;  // 初始化当前节点为根节点TreeNode* pre = NULL;  // 初始化前一个节点为NULL,用于记录前一个节点的值while (cur != NULL || !st.empty()) {if (cur != NULL) {st.push(cur);  // 将当前节点入栈cur = cur->left;  // 继续遍历左子树, 左} else {cur = st.top();  // 弹出栈顶节点作为当前节点, 中st.pop();// 判断当前节点值是否小于等于前一个节点的值,如果是,则不是有效的二叉搜索树if (pre != NULL && cur->val <= pre->val)return false;pre = cur;  // 更新前一个节点为当前节点cur = cur->right;  // 继续遍历右子树, 右}}return true;  // 遍历完整棵树后,没有发现非法节点值,返回true表示是一个有效的二叉搜索树}
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

如何在小程序中设置导航栏文字颜色和背景颜色

不同商家有不同的颜色风格&#xff0c;例如有些做设计的公司&#xff0c;主要是黑色风格&#xff1b;有些卖珠宝的商家&#xff0c;主要是金色风格&#xff1b;他们的小程序&#xff0c;也需要进行同样的风格设定。下面具体介绍怎么在小程序中进行整个风格设定。 1. 在小程序管…

Gooxi国鑫搭载第四代英特尔至强可扩展处理器系列服务器焕新登场

由算力驱动的数字经济渗透到了百行千业&#xff0c;在驱动传统经济转型升级和效能优化的同时&#xff0c;也大幅度增加了各行业数据处理能力的需求 。 面对千行百业加速创新应用和AIGC时代像潮水一样奔涌算力需求&#xff0c;得益于第四代英特尔至强可扩展处理器以及基于Gooxi最…

MySQL之MHA高可用配置及故障切换实例

MySQL之MHA高可用配置及故障切换实例 1、MHA概述1.1MHA 是什么1.2、MHA 的组成1.3MHA 的特点 2、MHA搭建准备2.1实验思路2.2实验准备 3、MHA搭建的步骤3.1配置主从复制3.2安装 MHA 软件3.3故障模拟 1、MHA概述 1.1MHA 是什么 MHA&#xff08;MasterHigh Availability&#xf…

大端字节序存储 | 小端字节序存储介绍

为什么存储的顺序有些变动呢&#xff1f; 大小端的介绍 我们在创建变量时&#xff0c;操作系统就会给你分配空间&#xff0c;比如你创建了【short/int/double/float】的变量&#xff0c;这些变量的类型都是大于1个字节的&#xff0c;操作系统会根据你这个变量的类型&#xff…

虹科分享 | 想买车无忧?AR为您带来全新体验!

新能源汽车的蓬勃发展&#xff0c;推动着汽车行业加速进行数字化变革。据数据显示&#xff0c;全球新能源汽车销售额持续上升&#xff0c;预计到2025年&#xff0c;新能源汽车市场规模将达到约 4200亿美元&#xff0c;年复合增长率超过 30%。这表明消费者对清洁能源出行的需求不…

AIGC AI绘画 Midjourney 参数大全详细列表

AIGC ChatGPT 职场案例 AI 绘画 与 短视频制作, Power BI 商业智能 68集, 数据库Mysql8.0 54集 数据库Oracle21C 142集, Office 2021实战, Python 数据分析, ETL Informatica 案例实战 Excel 2021实操,函数大全,图表大全,大屏可视化制作 加技巧500集 数据分析可视化T…

Android 13 骁龙相机点击拍照流程分析(一)——点击拍照到更新到左下角缩略图

一.背景 由于最近客户定制需要将文件挂载类型修改为sdcardfs,由于修改了文件挂载类型,导致了骁龙相机拍照后不能点击进入相册,故对骁龙相机从点击事件开始进行问题的排查,此处不介绍最终的sdcardfs挂载后的问题解决方案 二.流程介绍 拍照的流程大概分为几个阶段:打开相机…

【MySql】mysql之进阶查询语句

目录 一、常用查询 1、order by按关键字排序❤ 1.1 升序排序 1.2 降序排序 1.3 结合where进项条件过滤再排序 1.4 多字段排序 2、and和or判断 2.1 and和or的使用 2.2 嵌套、多条件使用 3、distinct 查询不重复记录 4、group by 对结果进行分组 5、limit限制结果…

深度学习笔记之优化算法(五)AdaGrad算法的简单认识

深度学习笔记之优化算法——AdaGrad算法的简单认识 引言回顾&#xff1a;动量法与Nesterov动量法优化学习率的合理性AdaGrad算法的简单认识AdaGrad的算法过程描述(2023/10/10)补充&#xff1a;AdaGrad示例代码 引言 上一节对 Nesterov \text{Nesterov} Nesterov动量法进行了简…

算法题:买卖股票的最佳时机 II (贪心算法解决股票问题)

这道题是贪心算法的中级难度练习题&#xff0c;由于题目设定&#xff0c;整个价格都是透明的&#xff0c;这里并不涉及需要预测股票涨势的问题。解决思路不难&#xff0c;就是一旦股票价格开始下降了就买入&#xff0c;一旦上升了&#xff0c;就赶紧卖出。&#xff08;完整题目…

SpringBoot 如何使用 Grafana 进行可视化监控

使用Spring Boot Sleuth进行分布式跟踪 在现代分布式应用程序中&#xff0c;跟踪请求和了解应用程序的性能是至关重要的。Spring Boot Sleuth是一个分布式跟踪解决方案&#xff0c;它可以帮助您在分布式系统中跟踪请求并分析性能问题。本文将介绍如何在Spring Boot应用程序中使…

DC2DC电源设计注意事项--1,Feedback

电源采集图如下图 Feedback 采集电压点应该在靠近负载侧。这样可以减少大电流导线导致的电压差&#xff0c;真实反应输出电压值 FB_1P21采集电路靠近芯片侧&#xff0c; 2.1&#xff0c;采集分压电路上侧为Vout Vnoise, 那么一分压就噪声就小了。假如采集电路远离芯片侧&…

CSS学习基础知识

CSS学习笔记 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width,…

Java-Atomic原子操作类详解及源码分析,Java原子操作类进阶,LongAdder源码分析

文章目录 一、Java原子操作类概述1、什么是原子操作类2、为什么要用原子操作类3、CAS入门 二、基本类型原子类1、概述2、代码实例 三、数组类型原子类1、概述2、代码实例 四、引用类型原子类1、概述2、AtomicReference3、ABA问题与AtomicStampedReference4、一次性修改&#xf…

ubuntu疑难杂症

1.ubuntu 使用apt 安装软件时提示出现不能获得lock $ sudo rm /var/lib/dpkg/lock$ sudo dpkg --configure -a$ sudo rm /var/lib/apt/lists/locksudo rm /var/lib/dpkg/lock sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/cache/apt/archives/lock

手机待办事项app哪个好?

手机是日常很多人随身携带的设备&#xff0c;手机除了拥有通讯功能外&#xff0c;还能帮助大家高效管理日常工作&#xff0c;借助手机上的待办事项提醒APP可以快速地帮助大家规划日常事务&#xff0c;提高工作的效率。 过去&#xff0c;我也曾经在寻找一款能够将工作任务清晰罗…

区块链技术的飞跃: 2023年的数字革命

随着时代的推进和技术的不断创新&#xff0c;2023年成为区块链技术飞跃发展的一年。区块链&#xff0c;一个曾经只是数字货币领域的技术&#xff0c;现在已经逐渐渗透到各个行业&#xff0c;成为推动数字经济发展的重要力量。在这个数字革命的时代&#xff0c;我们探讨区块链技…

水库大坝除险加固安全监测系统解决方案

一、系统背景 为贯彻落实《办公厅关于切实加强水库除险加固和运行管护工作的通知》&#xff08;〔2021〕8号&#xff09;要求&#xff0c;完成“十四五”小型病险水库除险加固、雨水情测报和大坝安全监测设施建设任务&#xff0c;规范项目管理&#xff0c;消除安全隐患&#xf…

Hadoop设置hdfs全局指令

在终端进入用户个人环境变量配置文件 vim ~/.bashrc 然后添加如下内容 export PATH$PATH:/usr/local/hadoop/bin 添加到你的hadoop下载目录的bin目录为止就可以了 重新激活一下配置文件 source ~/.bashrc hdfs有专属于自己的文件存储目录,加上特殊的指令就可以箱终端一…

Python“梦寻”淘宝天猫店铺所有数据接口,淘宝店铺所有商品数据API接口,淘宝API接口申请指南(含代码示例)

获取淘宝店铺所有商品数据的接口可以通过淘宝开放平台获取。 具体操作步骤如下&#xff1a; 在淘宝开放平台注册成为开发者&#xff0c;并创建一个应用&#xff0c;获取到所需的 App Key 和 App Secret 等信息。使用获取到的 App Key 和 App Secret&#xff0c;进行签名和认证…