98. 验证二叉搜索树

ops/2025/3/14 18:20:37/

文章目录

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

题目

二叉树:验证二叉搜索树
给你一个二叉树的根节点 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. 设定上下限法:在遍历二叉树的过程中,维护一个上下限的范围,对于每个节点,检查其值是否在该范围内,左子树的上限为当前节点值,右子树的下限为当前节点值,然后递归验证左右子树。

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

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


http://www.ppmy.cn/ops/165733.html

相关文章

《黑客攻防从入门到精通:工具篇》全15章万字深度总结——从工具解析到实战攻防,构建完整网络安全知识体系

目录 一、书籍核心逻辑与学习路径 二、核心模块与工具深度解析 模块1&#xff1a;信息收集与网络扫描 模块2&#xff1a;渗透测试与漏洞利用 模块3&#xff1a;密码攻防与身份认证 模块4&#xff1a;恶意程序攻防 模块5&#xff1a;网络追踪与反追踪 模块6&#xff1a;系…

Java Spring Boot 常用技术及核心注解

一、常用技术 自动配置&#xff08;Auto-Configuration&#xff09; Spring Boot 根据类路径中的依赖自动配置应用程序。例如&#xff0c;引入spring-boot-starter-web会自动配置内嵌 Tomcat 和 Spring MVC。 EnableAutoConfiguration // 启用自动配置起步依赖&#xff08;Sta…

汽车NVH诊断案例 | 纯电车急加速过大弯底盘异响

引言 失去发动机的掩蔽效应后&#xff0c;新能源电车的NVH问题&#xff0c;成为了困扰维修技师新难点。风噪、胎噪、电机高频啸叫等问题更容易车主识别&#xff0c;根源却难以被有效分辨。如何更精准且高效地识别电车NVH问题根源&#xff1f;今天分享的这个案例&#xff0c;内…

【架构艺术】Go语言微服务monorepo的代码架构设计

近期因为项目架构升级原因&#xff0c;笔者着手调研一些go项目monorepo的代码架构设计&#xff0c;目标是长期把既有微服务项目重要的部分都转移到monorepo上面&#xff0c;让代码更容易维护&#xff0c;协作开发更加方便。虽然经验不多&#xff0c;但既然有了初步的调研&#…

CSS3 用户界面设计指南

CSS3 用户界面设计指南 引言 随着互联网的快速发展,用户界面设计已经成为网站和应用程序吸引和留住用户的关键因素之一。CSS3,作为Web开发中的核心技术之一,提供了丰富的工具和特性来改善用户界面。本文将深入探讨CSS3在用户界面设计中的应用,包括基本概念、常用技巧以及…

得物 Android Crash 治理实践

一、前言 通过修复历史遗留的Crash漏报问题&#xff08;包括端侧SDK采集的兼容性优化及Crash平台的数据消费机制完善&#xff09;&#xff0c;得物Android端的Crash监控体系得到显著增强&#xff0c;使得历史Crash数据的完整捕获能力得到系统性改善&#xff0c;相应Crash指标也…

引入其他 YML 配置源 —— Spring Boot 中的 `import` 功能

文章目录 引入其他 YML 配置源 —— Spring Boot 中的 import 功能引言1. 为什么需要引入其他 YML 配置文件&#xff1f;2. Spring Boot 如何引入其他 YML 配置文件&#xff1f;2.1 基本语法2.2 支持多文件引入2.3 使用外部配置文件 3. 使用 import 功能的优势3.1 配置文件的模…

Python第二十课:生成对抗网络 | AI创造力觉醒

🎯 本节目标 理解生成器与判别器的博弈论原理掌握DCGAN与StyleGAN的核心架构差异实现AI绘画系统生成二次元角色学习梯度惩罚与谱归一化等稳定技巧探索GAN在艺术创作中的伦理边界一、GAN基础理论(艺术赝品对决) 1. 双角色博弈模型 角色职责生活比喻生成器(G)制造逼真数据天…