判断二叉搜索树(递归)

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。binary search tree (BST)

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

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

示例 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 {long long pre = LLONG_MIN; // 使用 long long 避免溢出
public:bool isValidBST(TreeNode* root) {if (!root) {return true;}if (!isValidBST(root->left) || root->val <= pre) {return false;}pre = root->val;  // 更新当前节点值return isValidBST(root->right);}
};

二叉搜索树进行中序遍历,得到的节点值应该是一个严格递增的序列。这意味着,只有当树是有效的二叉搜索树时,按中序遍历得到的值才会从小到大排列。

!isValidBST(root->left) : 

递归检查左子树,如果左子树不是有效的二叉搜索树,返回 false

root->val <= pre:

当前节点值必须大于前一个节点的值

实例:

      5
     / \
    3   7
   / \   / \
  1   4 6   8

第1次递归:根节点 5

  • 当前节点是 5,递归检查左子树。

第2次递归:节点 3

  • 当前节点是 3,递归检查左子树。

第3次递归:节点 1

  • 当前节点是 1,递归检查左子树(为空),返回 true
  • 节点 1 的值比 pre = LLONG_MIN 大,更新 pre = 1
  • 递归检查右子树(为空),返回 true
  • 节点 1 的子树符合 BST 条件,返回 true

回到第2次递归:节点 3

  • 当前节点是 3,递归检查右子树。

第4次递归:节点 4

  • 当前节点是 4,递归检查左子树(为空),返回 true
  • 节点 4 的值比 pre = 1 大,更新 pre = 4
  • 递归检查右子树(为空),返回 true
  • 节点 4 的子树符合 BST 条件,返回 true

回到第2次递归:节点 3

  • 当前节点是 3,递归检查右子树(节点 4),返回 true
  • 节点 3 的值比 pre = 4 小,因此返回 false,树不符合 BST 条件。

后序遍历:

class Solution {
public:bool isValidBST(TreeNode* root) {return isV(root, LONG_MIN, LONG_MAX);}bool isV(TreeNode* root, long min, long max) {if (!root) return true;  // 空节点是有效的if (root->val <= min || root->val >= max) {return false;  // 当前节点值不在有效范围内}return isV(root->left, min, root->val) && isV(root->right, root->val, max);}
};

isV(root->left, min, root->val)

对左子树的值进行递归检查,更新右边界为当前节点的值

isV(root->right, root->val, max)

对右子树的值进行递归检查,更新左边界为当前节点的值

实例:

      5
     / \
    3   7
   / \   / \
  1   4 6   8
 

从根节点开始

  • 根节点:值为 5
  • 对于左子树,根节点的值 5 会作为右边界(最大值)。
  • 对于右子树,根节点的值 5 会作为左边界(最小值)。
  • 递归地对左子树和右子树进行检查。

检查左子树

  • 左子树的根节点是 3,并且它的值应该大于 -∞ 并且小于 5
    • 左子树的左节点为 1,它应该大于 -∞ 并且小于 3
    • 左子树的右节点为 4,它应该大于 3 并且小于 5

检查右子树

  • 右子树的根节点是 7,并且它的值应该大于 5 并且小于
    • 右子树的左节点是 6,它应该大于 5 并且小于 7
    • 右子树的右节点是 8,它应该大于 7 并且小于

遍历结束

  • 如果每个节点都符合它应该满足的条件,那么这棵树就是一个有效的二叉搜索树(BST)。
  • 如果有任何节点违反了这个条件,则这棵树不是一个有效的二叉搜索树。

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

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

相关文章

【系统设计】高效的分布式系统:使用 Spring Boot 和 Kafka 实现 Saga 模式

在现代分布式系统中&#xff0c;管理跨多个服务的长事务至关重要。传统的分布式事务解决方案往往面临性能瓶颈和复杂性问题&#xff0c;而 Saga 模式 作为一种灵活高效的解决方案&#xff0c;逐渐受到开发者的青睐。本文将探讨如何利用 Spring Boot 和 Kafka 实现 Saga 模式&am…

私有化视频平台EasyCVR海康大华宇视视频平台视频诊断技术是如何实时监测视频质量的?

在现代视频监控系统中&#xff0c;确保视频流的质量和稳定性至关重要。随着技术的进步&#xff0c;视频诊断技术已经成为实时监测视频质量的关键工具。这种技术通过智能分析算法对视频流进行实时评估和处理&#xff0c;能够自动识别视频中的各种质量问题&#xff0c;并给出相应…

JAVA题目笔记(十三) 爬虫

一、网络爬取 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.regex.Matcher; import java.util.regex.Pattern;public class Main {public static v…

探索现代软件开发的五大趋势

在快速变化的技术领域&#xff0c;软件开发正经历着前所未有的变革。随着新工具、框架和编程语言的不断涌现&#xff0c;开发人员必须保持与时俱进&#xff0c;以确保他们的技能和知识库不会过时。本文将探讨当前软件开发领域的五大趋势&#xff0c;以及它们如何塑造未来的技术…

大语言模型(LLM)量化基础知识(一)

请大家关注我的知乎博客&#xff1a;- 派神 - - 知乎 随着大型语言模型 (LLM) 的参数数量的增长,与其支持硬件&#xff08;加速器内存&#xff09;增长速度之间的差距越来越大&#xff0c;如下图所示&#xff1a; 上图显示&#xff0c;从 2017 年到 2022 年&#xff0c;语言模…

谨慎使用assert的原因

使用 assert 进行调试和错误检查确实有其优点&#xff0c;但在某些情况下可能会引发一些问题&#xff0c;尤其是在嵌入式系统或特定的应用场景中。下面是 assert 的潜在问题和使用注意事项&#xff1a; 1. 在生产环境中的副作用 问题&#xff1a;assert 通常用于开发和调试阶段…

使用VBA宏合并多个Excel文件的Sheet页

使用VBA宏合并多个Excel文件的Sheet页 在日常的Excel数据处理工作中&#xff0c;我们经常需要将多个Excel文件中的工作表合并到一个Excel文件中。这种操作可以极大地提高数据处理效率&#xff0c;但如果文件数量较多&#xff0c;手动合并会非常繁琐。本文将介绍如何使用VBA宏来…

【comfyui教程】ComfyUI 现已支持 Stable Diffusion 3.5 Medium!人人都能轻松上手的图像生成利器

前言 ComfyUI 现已支持 Stable Diffusion 3.5 Medium&#xff01;人人都能轻松上手的图像生成利器 大家翘首以盼的Stable Diffusion 3.5 Medium模型终于来了&#xff01;就在今天&#xff0c;Stability AI 正式推出了这款“亲民版”平衡模型&#xff0c;让创作者们得以在消费…

大模型微调技术 --> LoRA 系列之 AdaLoRA

AdaLoRA 1.摘要 之前的微调方法(如低秩更新)通常将增量更新的预算均匀地分布在所有预训练的权重矩阵上&#xff0c;并且忽略了不同权重参数的不同重要性。结果&#xff0c;微调结果不是最优的。 为了弥补这一差距&#xff0c;我们提出了AdaLoRA&#xff0c;它根据权重矩阵的…

带你搞懂红黑树的插入和删除

文章目录 1. 红黑树1.1 红黑树的概念1.2 红黑树的性质1.3 红黑树节点的定义1.4 红黑树的插入找到插入的位置调节平衡 1.5 红黑树的删除删除节点平衡调整 1.6 红黑树和AVL树的比较 1. 红黑树 1.1 红黑树的概念 红黑树也是一种二叉搜索树,但是在每一个节点上增加了一个存储位表…

揭秘全向轮运动学:机动艺术与上下位机通信的智慧桥梁

✨✨ Rqtz 个人主页 : 点击✨✨ &#x1f308;Qt系列专栏:点击 &#x1f388;Qt智能车上位机专栏: 点击&#x1f388; 本篇文章介绍的是有关于全向轮运动学分析&#xff0c;单片机与上位机通信C代码以及ROS里程计解算的内容。 目录 大纲 ROS&#xff08;机器人操作系统&…

Python 函数类型

普通函数匿名函数&#xff08;Lambda函数&#xff09;高阶函数内置函数递归函数闭包函数装饰器函数方法 8.1. 实例方法 8.2. 类方法 8.3. 静态方法 1. 普通函数 最基本的函数类型&#xff0c;通过 def 关键字定义。 def add(a, b):return a bprint(add(3, 5)) # 输出: 82…

移远通信推出八款天线新品,覆盖5G、4G、Wi-Fi和LoRa领域

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;再次推出八款高性能天线新品&#xff0c;进一步丰富其天线产品阵容&#xff0c;更好地满足全球客户对高品质天线的更多需求。具体包括5G超宽带天线YECT005W1A和YECT004W1A、5G天线YECT028W1A、4G天…

深度学习:NAT Decoder 详解

NAT Decoder 详解 非自回归转换器&#xff08;Non-Autoregressive Transformer, NAT&#xff09;解码器是一种特殊类型的解码器&#xff0c;设计用来在序列生成任务中加速输出的生成过程。与传统的自回归解码器&#xff08;如上文所述的AT解码器&#xff09;不同&#xff0c;N…

【设计模式系列】桥接模式(十三)

一、什么是桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;其核心目的是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式主要用于处理那些在设计时无法确定实现细节的场合&#xff0c;或者需要在多个实现之间…

Java多态和继承(下篇)

今天接着学习多态和继承 目录 1 继承1.1 再谈初始化1.2 protect关键字1.3 继承方式1.4 final 关键字1.5 组合 2 多态2.1 多态的概念2.2 多态实现条件2.3 重写2.4 向上转型和向下转型2.4.1 向上转型2.4.2 向下转型 2.5 多态的优缺点2.6 避免在构造方法中使用重写的方法 总结 1 继…

动态规划理论基础和习题【力扣】【算法学习day.25】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

数据结构之顺序表(C语言)

1 线性表 线性表是n个具有相同特性的数据元素的有限序列&#xff0c;是一种在实际中广泛应用的数据结构&#xff0c;常见的线性表有&#xff1a;顺序表、链表、栈、队列、字符串等。 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。但是在物理结构上并不一定是…

Qt——窗口

一.窗口概述 Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;继承QWidget类&#xff0c;并且提供一个预定义的布局。包含一个菜单栏&#xff08;menu bar&#xff09;&#xff0c;多个工具栏&#xff08;tool bars&#xff0…

长亭那个检测能力超强的 WAF,出免费版啦

告诉你们一个震撼人心的消息&#xff0c;那个检测能力超强的 WAF——长亭雷池&#xff0c;他推出免费社区版啦&#xff0c;体验地址见文末。 八年前我刚从学校毕业&#xff0c;在腾讯做安全研究&#xff0c;看到宇森在 BlackHat 上演讲的议题 《永别了&#xff0c;SQL 注入》 …