当前位置: 首页 > news >正文

98. 验证二叉搜索树

       

        题目要求判断给定的二叉树是否为二叉搜索树。

        二叉搜索树的定义如下:

  1. 节点的左子树仅包含小于当前节点的数值;
  2. 节点的右子树仅包含大于当前节点的数值;
  3. 左子树和右子树本身也必须满足二叉搜索树的条件。

        二叉树的左右子树与整棵树具有相似的结构特征,这种特性自然地将问题分解为若干子问题。在判断一棵树是否为二叉搜索树时,我们可以先分别判断其子树是否符合二叉搜索树的定义。根据二叉搜索树的性质,可以通过节点值的大小关系进行判断:首先检查左子树,然后比较当前节点值与前一节点值,最后检查右子树。这种遍历方式被称为中序遍历。

        代码:

class Solution {
public:long long pre = LLONG_MIN;bool isValidBST(TreeNode* root) {if (!root) return true;if (!isValidBST(root->left)) return false;if (pre >= root->val) return false;pre = root->val;return isValidBST(root->right);}
};

        时间复杂度:O(n),每个节点都会遍历一次

        空间复杂度:O(n),最坏情况下,树退化成链 

        换种角度看问题,是否可以先判断节点,在判断左右子树呢?可以。

       

该图表明,当前根节点的取值范围由其父节点或祖父节点的取值决定。例如

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​

        2的取值范围为(-∞, 5],4的取值范围为[2, 5]。特别需要注意的是,整棵树的根节点5没有父节点,因此其取值范围为(-∞, +∞)。这种先访问节点值,再递归遍历左右子树的遍历方式称为前序遍历。

算法步骤如下:

  1. 判断根节点的值是否在当前取值范围内
  2. 遍历左子树,将右边界更新为当前根节点的值
  3. 遍历右子树,将左边界更新为当前根节点的值

        代码:

        

class Solution {
public:bool isValidBST(TreeNode* root,long long left = LLONG_MIN,long long right = LLONG_MAX) {if (!root) return true;long long x = root->val;return left < x && x < right && isValidBST(root->left,left,x) && isValidBST(root->right,x,right);}
};

        时间复杂度,空间复杂度与中序一致 

http://www.xdnf.cn/news/496747.html

相关文章:

  • 信息系统项目管理师高级-软考高项案例分析备考指南(2023年案例分析)
  • 神经网络与深度学习第六章--循环神经网络(理论)
  • WebXR教学 07 项目5 贪吃蛇小游戏
  • 亲测有效!OGG 创建抽取进程报错 OGG-08241,如何解决?
  • 简单神经网络(ANN)实现:从零开始构建第一个模型
  • 【第二篇】 初步解析Spring Boot
  • 第9讲、深入理解Scaled Dot-Product Attention
  • 【漫话机器学习系列】264.内距(又称四分位差)Interquartile Range
  • 抽奖系统-抽奖
  • uni-app小程序登录后…
  • 数据分析_Python
  • arduino平台读取鼠标光电传感器
  • MATLAB学习笔记(七):MATLAB建模城市的雨季防洪排污的问题
  • Elasticsearch 性能优化面试宝典
  • LabVIEW声音与振动测量分析
  • STM32实战指南:SG90舵机控制原理与代码详解
  • Qt与Hid设备通信
  • 392. Is Subsequence
  • 天拓四方锂电池卷绕机 PLC 物联网解决方案
  • 从零开始认识 Node.js:异步非阻塞的魅力
  • Go语言 GORM框架 使用指南
  • c/c++的opencv模糊
  • exit耗时高
  • PYTHON训练营DAY28
  • AMD Vivado™ 设计套件生成加密比特流和加密密钥
  • 【React中虚拟DOM与Diff算法详解】
  • 免费商用字体下载
  • STM32IIC协议基础及Cube配置
  • 创建react工程并集成tailwindcss
  • C++(20): 文件输入输出库 —— <fstream>