LeetCode98. 验证二叉搜索树

news/2024/9/8 19:30:28/文章来源:https://www.cnblogs.com/Tomorrowland/p/18328860

题目链接:https://leetcode.cn/problems/validate-binary-search-tree/description/

题目叙述:

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

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

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

示例 1:

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

示例 2:


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

提示:

树中节点数目范围在[1, 10^4] 内
-2^31 <= Node.val <= 2^31 - 1

思路:

二叉搜索树是一颗有序的树,我们可以利用这个很有用的性质

我们知道二叉树的每个结点,它的左子树上的所有结点都小于这个结点,它的右子树上的所有结点都大于这个结点

那么我们使用中序遍历,将这个二叉搜索树中的元素全部存取到数组中,这个数组就是有序的了(如果是二叉搜索树的话)

那么现在我们就转化成了判断一个数组的序列是否有序了

代码:

class Solution {
public:void traversal(TreeNode* root, vector<int>& vec) {if (root == NULL) return;//处理左子树traversal(root->left, vec);//处理中的逻辑vec.push_back(root->val);//处理右子树traversal(root->right, vec);}bool isValidBST(TreeNode* root) {vector<int> vec;traversal(root, vec);for (int i = 1; i < vec.size(); i++) {//找到了无序的序列,就直接返回falseif (vec[i] <= vec[i - 1]) return false;}//否则,返回truereturn true;}
};

另一种方法

其实,这题我们可以不使用数组来记录所有的结点,可以使用一个指针,用来记录上一个访问过的结点,然后比较上一个结点和当前结点的大小,如果不同,就直接返回false,相同则

调用递归函数比较左右子树,如果左右子树有一个为false,则为false,否则就是true

代码

class Solution {
public:TreeNode*pre=NULL;bool isValidBST(TreeNode* root) {if(root==NULL) return true;//递归处理左子树int left=isValidBST(root->left);//如果上一个结点大于当前结点,返回falseif(pre!=NULL&&pre->val>=root->val) return false;//更新pre的值pre=root;int right=isValidBST(root->right);//left和right有一个为假,就是假return left&&right;}
};

迭代法

这题迭代法的代码与第二种的思路很像,也是使用一个指针来存储上一个结点的值

迭代法代码:

class Solution {
public:bool isValidBST(TreeNode* root) {if(root==NULL) return true;stack<TreeNode*> st;TreeNode*pre=NULL;TreeNode*cur=root;while(!st.empty()||cur!=NULL){if(cur!=NULL){st.push(cur);cur=cur->left;}else{cur=st.top();st.pop();//找到比上一个结点大的结点,直接返回falseif(pre!=NULL&&pre->val>=cur->val) return false;pre=cur;cur=cur->right; }}return true;}
};

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

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

相关文章

乒乓球比赛计分程序模拟冲刺(Sprint)计划

模拟冲刺(Sprint)计划选择的小用户故事:赵冠军(运动员)- 实时比分显示张赛事(赛事组织者)- 赛事信息录入王公正(裁判员)- 自动计分与记录一、任务拆分及开发时间(假设为网页版程序): 1. 赵冠军 - 实时比分显示 任务1:设计实时比分显示界面 开发时间:2天任务描述:…

一台个人pc电脑如何多开微信

之前在联想做技术支持,一直都是给客户一个附件文件来多开,今天教各位一个简单快捷的方法,工具的方法我也提供下,在文档结尾。 先用记事本编辑 start "" "C:\ProgramFiles\Tencent\WeChat\WeChat.exe"文件另存为bat后缀文件之后就是ctrl+c ctrl+v选中多…

结构体中vector的初始化报错:expected identifier before numeric constant

结构体中vector的初始化报错:expected identifier before numeric constant 结构体中vector初始化 起因: 我想在结构体中初始化含有3个元素的vector。报错: expected identifier before numeric constant,意思是数字常量前应该要有表示符。 原因: 编译器认为我正在定义一个…

HDU7458-启发式合并优化DP

link:https://acm.hdu.edu.cn/showproblem.php?pid=7458 题意:给一棵树,每个点有点权 \(w\) 和颜色 \(c\),选择若干条不相交的路径,每条路径的起始点颜色相同,权值为起始点的权值之和,最大化权值之和。对每条路径 \((u,v)\) 可以放到LCA上考虑,即我们对每个子树考虑,…

LeetCode617. 合并二叉树

题目链接:https://leetcode.cn/problems/merge-two-binary-trees/description/ 题目叙述: 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是…

线段树(1)建树、单点修改、单点查询、区间查询和例题

闲了好久的wym复活拉~更个辣鸡的线段树 如果你不知道什么是线段树这个就不用看 由于我们平时可能会遇到一些恶心的题叫做给你 \(10^5\) 个数的数组,然后 \(10^5\) 次修改或查询,这样显然暴力是可以做的而且ST表我们无视修改。这个时候可以用线段树、树状数组或者其他大佬们的…

全网最适合入门的面向对象编程教程:26 类和对象的 Python 实现-上下文管理器和 with 语句

本文主要介绍了在使用Python面向对象编程时,如何使用上下文管理器和with语句替换异常处理中try...finally语句,并介绍了with语句的优点和应用场景。全网最适合入门的面向对象编程教程:26 类和对象的 Python 实现-上下文管理器和 with 语句摘要: 本文主要介绍了在使用 Pytho…

RMI 反序列化详细分析

java RMI 学习 RMI 是什么 Java RMI(Java Remote Method Invocation),即Java远程方法调用。是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。RMI 使用 JRMP(一种协议)实现,使得客户端运行的程序可以调用远程服务器上的对象。是实现RPC的一种方式。 RMI 的构…

GPT-SoVITS —— 5s 声音样本就可以训练模型,复刻声音的 AI 应用

用极少量的声音样本,快速训练模型,复刻声音。然后用改声音进行推理,完成文本到语音的转换。今天给大家介绍一个开源项目:GPT-SoVITS 项目地址: https://github.com/RVC-Boss/GPT-SoVITS 从某种意义上来说,它是一个 TTS 模型。支持从文本到语音的转换。单纯的 TTS 模型有很…

C++继承时的修饰符

在继承时加入的关键字,可以修饰继承来的类成员这里的func1()和func2()都是proteced,不能在类外部访问这里的func1()是public,但是func2()依然是protected

财务知识-17条常用的计提会计分录总结

财务知识-17条常用的计提会计分录总结❗️

Segment-anything学习到微调系列_SAM初步了解

## 前言 本系列文章是博主在工作中使用SAM模型时的学习笔记,包含三部分: 1. SAM初步理解,简单介绍模型框架,不涉及细节和代码2. SAM细节理解,对各模块结合代码进一步分析3. SAM微调实例,原始代码涉及隐私,此部分使用公开的VOC2007数据集,Point和Box作为提示进行mask de…