98. 验证二叉搜索树

embedded/2025/3/15 3:57:49/

文章目录

    • 题目
    • 代码
    • 原理图
    • 方法及解释
    • 小结

题目

二叉树:验证二叉搜索树
给你一个二叉树的根节点 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

代码

/*** 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:bool isValidBST(TreeNode* root) {long long pre_val=LONG_MIN;//声明一个最小值return help(root,pre_val);递归}bool help(TreeNode* root,long long &pre_val){if(!root) return true;//若头结点为空则返回true为二叉搜索树,同时是一个跳出条件if(!help(root->left,pre_val))return false;//在递归遍历左子树if(root->val<=pre_val)return false;//若根节点的值小于左子树的值则不符合二叉搜索树pre_val=root->val;//然后更新值为根节点的值if(!help(root->right,pre_val))return false;//然后递归遍历右子树return true;//若以上都没有以false返回,则该二叉树为二叉搜索树}
};

原理图

在这里插入图片描述

方法及解释

提示:算法流程及解释在代码中已标注
方法1:
首先通过中序遍历遍历所有节点,并保存到一次新的数组中,对于二叉搜索树该数组中的元素是升序的,通过设定两个指针,pre与cur比较两者要满足pre小于cur,然后分别往后移动直到遍历完毕,但是该种方法需要一个单独的数组用来保存。

方法2:推荐
仅使用一个pre_val来保存遍历时的前一个节点的值用来和当前节点的值进行比较,此方法也能够实现在遍历二叉树时同时做了比较,空间复杂度为O(1)。

小结

验证二叉搜索树算法主要涉及检查二叉树是否符合二叉搜索树的定义,即对于每个节点,左子树中的所有节点值小于该节点的值,右子树中的所有节点值大于该节点的值。以下是验证二叉搜索树算法的小结:

  1. 递归法:可以使用递归方法来验证二叉搜索树。对于每个节点,检查其值是否在给定的范围内,并递归地对左子树和右子树进行验证。

  2. 中序遍历法:通过中序遍历二叉搜索树,可以得到一个递增的序列。因此,可以在中序遍历的过程中检查节点值是否递增来验证是否为二叉搜索树。

  3. 设定上下限法:在遍历二叉树的过程中,维护一个上下限的范围,对于每个节点,检查其值是否在该范围内,左子树的上限为当前节点值,右子树的下限为当前节点值,然后递归验证左右子树。

  4. 使用堆栈或队列:可以使用堆栈或队列来进行迭代遍历二叉树,并在遍历过程中验证每个节点的值是否符合二叉搜索树的定义。

总的来说,验证二叉搜索树算法广泛应用于树的数据结构中,通过合适的方法可以高效地验证给定的二叉树是否符合二叉搜索树的定义。验证二叉搜索树算法主要涉及检查二叉树是否符合二叉搜索树的定义,即对于每个节点,左子树中的所有节点值小于该节点的值,右子树中的所有节点值大于该节点的值。以下是验证二叉搜索树算法的小结:

  1. 递归法:可以使用递归方法来验证二叉搜索树。对于每个节点,检查其值是否在给定的范围内,并递归地对左子树和右子树进行验证。

  2. 中序遍历法:通过中序遍历二叉搜索树,可以得到一个递增的序列。因此,可以在中序遍历的过程中检查节点值是否递增来验证是否为二叉搜索树。

  3. 设定上下限法:在遍历二叉树的过程中,维护一个上下限的范围,对于每个节点,检查其值是否在该范围内,左子树的上限为当前节点值,右子树的下限为当前节点值,然后递归验证左右子树。

总的来说,验证二叉搜索树算法广泛应用于树的数据结构中,通过合适的方法可以高效地验证给定的二叉树是否符合二叉搜索树的定义。
在这里插入图片描述

原理图借鉴哔站华南溜达虎,如有侵权联系删除。

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

相关文章

Qt/C++音视频开发82-系统音量值获取和设置/音量大小/静音

一、前言 在音视频开发中&#xff0c;音量的控制分两块&#xff0c;一个是控制播放器本身的音量&#xff0c;绝大部分场景都是需要控制这个&#xff0c;这个不会影响系统音量的设置。还有一种场景是需要控制系统的音量&#xff0c;因为播放器本身的音量是在系统音量的基础上控…

Flask Jinja语法总结篇

目录 1️⃣ 变量(Variables) 2️⃣ 条件语句(if 语句) 3️⃣ 循环(for 语句) 4️⃣ 过滤器(Filters) 5️⃣ 宏(Macros,类似于函数) 6️⃣ 模板继承(Template Inheritance) 7️⃣ 包含模板(Include) 8️⃣ Flask 结合 Jinja 总结 Jinja 是 Flask 默认使…

AGI大模型(3):大模型生成内容

1 大模型是怎么生成内容的 简单来说就是靠"猜"&#xff01; 虽然⾮常不可思议&#xff0c;但事实就是这样&#xff0c;现阶段所有的 NLP 任务&#xff0c;都不意味着机器真正理解这个世界&#xff0c;它只是在玩⽂字游戏&#xff0c;进⾏⼀次⼜⼀次的概率解谜&…

Elasticsearch 解析 updateTime 字段时格式错误

遇到的问题: {"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"failed to parse field [updateTime] of type [date] in document with id 57"}],"type":"mapper_parsing…

Python第十八课:目标检测 | 让计算机看懂世界

🎯 本节目标 理解目标定位与分类的核心差异掌握YOLO算法的实时检测原理解析锚框(Anchor Box)的尺度适应机制开发实战项目:交通场景行人车辆检测系统学习模型量化与移动端部署基础一、目标检测基础(视觉世界的GPS) 1. 核心任务拆解 任务类型输出内容生活比喻图像分类图片…

Python 数据可视化

Python 提供了多种强大的库用于数据可视化&#xff0c;常用的库包括 Matplotlib、Seaborn、Plotly、Pandas 和 Bokeh 等。以下是这些库的简介和一些常见的数据可视化示例。 1. Matplotlib Matplotlib 是 Python 中最常用的绘图库&#xff0c;提供了类似 MATLAB 的绘图接口。 …

R格式 | 第十五届蓝桥杯C++B组

小蓝最近在研究一种浮点数的表示方法&#xff1a;RR 格式。 对于一个大于 00 的浮点数 dd&#xff0c;可以用 RR 格式的整数来表示。 给定一个转换参数 nn&#xff0c;将浮点数转换为 RR 格式整数的做法是: 将浮点数乘以 2n2n&#xff1b;四舍五入到最接近的整数。 输入格式…

matlab慕课学习3.2+3.3

于20250310 3.2用if语句实现选择结构 3.2.1什么是选择结构 用if 语句和switch语句可实现选择结构 3.2.2单分支if语句 if 条件语句组 %可以是一条也可是多条end 当条件为标量&#xff0c;非0表成立&#xff0c;0表示不成立。 当条件为矩阵时&#xff0c;矩阵非空&#xff…