LC 98.验证二叉搜索树

98.验证二叉搜索树

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 树中节点数目范围在 [ 1 , 1 0 4 ] [1, 10^4] [1,104]
  • − 2 31 ≤ N o d e . v a l ≤ 2 31 − 1 -2^{31} \leq Node.val \leq 2^{31} - 1 231Node.val2311

解法一(模拟+dfs)

思路分析:

  1. 利用二叉搜索树的性质,对树的节点进行检验
  2. 采用深度优先搜索进行遍历
    实现代码如下:
class Solution {
    public boolean isValidBST(TreeNode root) {
		return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }
	private boolean isValidBST(TreeNode node, long minVal, long maxVal) {
		if (node == null)
			return true;
		if (node.val <= minVal || node.val >= maxVal)
			return false;	// 该节点值 不满足二叉搜索树的范围 返回false
		return isValidBST(node.left, minVal, node.val) && isValidBST(node.right, node.val, maxVal);
	}
}

提交结果如下:

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:42.1 MB,击败了88.95% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

解法二(中序遍历+二叉搜索树性质)

思路分析:

  1. 根据二叉搜索树,节点左子树只包含小于当前节点的值, 节点右子树只包含大于当前节点的值,可以采用中序遍历;左中右的顺序,可以得到一个递增的有序数组
  2. 即判断中序遍历后的数组是否有序递增,即可检验该二叉树是否为二叉搜索树
  3. 同时,利用双指针,可以标记遍历前一个节点,然后进行比较,判断当前遍历节点值是否大于前一个节点值
    1. 大于,则符合二叉搜索树特点,继续遍历判断
    2. 小于,则不符合特点,返回false

实现代码如下:

class Solution {
	// 中序遍历
	TreeNode pre = null;	// 标记中序遍历顺序当前节点的前一个节点
	public boolean isValidBST(TreeNode root) {
		if (root == null)
			return true;
		boolean left = isValidBST(root.left);	// 中序遍历先 遍历判断左子树
		if (pre != null && pre.val >= root.val)		// 再判断中
			return false;	// 不符合条件
		pre = root;	// 更新指针
		boolean right = isValidBST(root.right);	// 中序遍历 遍历判断右子树
		return left && right;
	}
}

提交结果如下:

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:42.3 MB,击败了70.75% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue cli创建项目时键盘操作无效;vue3.0项目搭建自定义配置

一. 问题描述 在创建vue3.0项目时&#xff0c;在建好的文件夹&#xff0c;鼠标右键 git bash 使用 vue create my-vue3.0创建新项目时&#xff0c;键盘方向键失效&#xff0c;无法选中对应的选项&#xff08;交互提示符不工作&#xff09; 解决方案&#xff1a; 方案一 使用…

架构评估方法相关知识总结

一、架构评估中的重要概念 定义&#xff1a;软件架构评估是在对架构分析、评估的基础上&#xff0c;对架构策略的选取进行决策。 常用系统架构评估的方式&#xff1a; 1. 基于调查问卷或检查表的方法&#xff1a;该方法的关键是设计好问卷或检查表。缺点是在很大 程度上依赖于评…

华为北向网管NCE开发教程(5)打包org.omg.CosNotification找不到

1问题描述 在IDE中&#xff0c;代码能正常运行&#xff0c;但是打包的时候&#xff0c;会抱不到一些类 2问题原因 导入的本地包中&#xff0c;能在IDE中找到&#xff0c;但是在使用maven打包时&#xff0c;maven找不到这些依赖包 3解决办法 将依赖包通过maven安装到maven…

算法沉淀 —— 动态规划篇(斐波那契数列模型)

算法沉淀 —— 动态规划篇&#xff08;斐波那契数列模型&#xff09; 前言一、第 N 个泰波那契数二、三步问题三、使用最小花费爬楼梯四、解码方法 前言 几乎所有的动态规划问题大致可分为以下5个步骤&#xff0c;后续所有问题分析都将基于此 1.、状态表示&#xff1a;通常状态…

Matlab|【免费】基于数据驱动的模型预测控制电力系统机组组合优化

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《Feature-Driven Economic Improvement for Network-Constrained Unit Commitment: A Closed-Loop Predict-and-Optimize Framework》&#xff0c;程序主要做的是一个基于数据驱动的电力系统机…

YOLO算法改进Backbone系列之:CoaT

在本文中&#xff0c;我们提出了co-scale conv-attention image transformer&#xff08;CoaT&#xff09;&#xff0c;这是一种基于Transformer的图像分类器&#xff0c;配备了co-scale和conv-attention机制。首先&#xff0c;co-scale机制在各个尺度上保持Transformer编码器支…

09、ArrayList

ArrayList 文章目录 ArrayList集合与数组ArrayList集合进阶集合体系结构Collection集合List集合&#xff08;接口&#xff09;数据结构ArrayList集合LinkedList集合 Set集合HashSet 双列集合创建不可变集合 集合与数组 自动扩容 无法存储基本数据类型&#xff0c;只能将其变为…

【C++】CC++内存管理

目录 一、C/C内存分布二 、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、 C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型3.3 长度域 四、operator new与operator delete函数五、new和delete的实现原理5.1 内置类型5.2 自定义类…

K8S--水平自动扩缩容实战演练

原文网址&#xff1a;K8S--水平自动扩缩容实战演练-CSDN博客 简介 本文用实例来展示K8S的自动扩缩容&#xff08;水平方向&#xff09;。 官网网址 HorizontalPodAutoscaler 演练 | Kubernetes 为 Pod 和容器管理资源 | Kubernetes 水平扩缩的原理 水平扩缩容&#xff…

阿里云-零基础入门NLP【基于深度学习的文本分类3-BERT】

文章目录 学习过程赛题理解学习目标赛题数据数据标签评测指标解题思路BERT代码 学习过程 20年当时自身功底是比较零基础(会写些基础的Python[三个科学计算包]数据分析)&#xff0c;一开始看这块其实挺懵的&#xff0c;不会就去问百度或其他人&#xff0c;当时遇见困难挺害怕的…

NKCTF2024-Eznative

首先使用blutter解析&#xff0c;拿到如上的output文件 先看看asm 都被混淆了&#xff0c;真的是太可恶了。 查看libapp.so的内容 一点符号都不给&#xff0c;首先我们使用LoadScript File去添加一部分符号 加载之前解析的 恢复了一部分&#xff0c;但是没有什么乱用啊 这个时候…

微服务(基础篇-002-Ribbon)

目录 Ribbon负载均衡&#xff08;1&#xff09; 负载均衡的原理&#xff08;1.1&#xff09; 负载均衡策略&#xff08;1.2&#xff09; Ribbon-IRule(1.2.1) 修改负载均衡的方法&#xff08;1.2.2&#xff09; 懒加载&#xff08;1.3&#xff09; 饥饿加载&#xff08;1…

吴恩达2022机器学习专项课程(一) 3.3 成本函数的公式

问题预览 模型的参数&#xff08;w和b&#xff09;有什么作用&#xff1f;不同的w和b对线性回归模型有什么影响&#xff1f;训练集里的y和线性回归模型预测的y&#xff08;y帽&#xff09;的区别是什么&#xff1f;成本函数的作用是什么&#xff1f;成本函数的公式是什么&…

【PyQt】19-数据操作

数据表 前言一、显示二维表数据&#xff08;QTableView控件&#xff09;扩展知识---MVC模式1.1 代码1.2 运行结果 二、显示列数据&#xff08;QListView控件&#xff09;2.1 代码2.2 运行结果2.3 扩展---列表控件&#xff08;QListWidget&#xff09;运行结果 总结 前言 一、显…

C语言中的联合和枚举

1、联合体 联合体类型的声明 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以不同的类型。但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫&#xff1a;共⽤体。因为所有变量公用…

UE5 LiveLink 自动连接数据源,以及打包后不能收到udp消息的解决办法

为什么要自动连接数据源&#xff0c;因为方便打包后接收数据&#xff0c;这里我是写在了Game Instance,也可以写在其他地方&#xff0c;自行替换成Beginplay和Endplay 关于编辑器模式下能收到udp消息&#xff0c;打包后不能收到消息的问题有两点需要排查&#xff0c;启动打包后…

2024年阿里云轻量应用服务器优惠价格_2核2G_2核4G报价

阿里云轻量应用服务器2核2G和2核4G配置优惠价格表&#xff0c;轻量2核2G3M带宽61元一年&#xff0c;轻量2核4G4M带宽165元1年&#xff0c;均不限制月流量&#xff0c;阿里云活动链接 aliyunfuwuqi.com/go/aliyun 活动打开如下图&#xff1a; 阿里云轻量应用服务器价格 61元/年…

Spring Boot:基础配置

Spring Boot 全局配置文件application.propertiesapplication.yml全局配置文件的优先级 从全局配置文件中获取数据的注解从外部属性文件中获取数据的注解全局配置文件的配置项通用配置项数据源配置项JPA 配置项日志配置项配置文件特定配置项Profile 特定配置项 配置类配置文件中…

C++项目——集群聊天服务器项目(三)muduo网络库

今天来介绍集群聊天器项目中网络模块代码的核心模块——muduo网络库&#xff0c;一起来看看吧~ 环境搭建C项目——集群聊天服务器项目(一)项目介绍、环境搭建、Boost库安装、Muduo库安装、Linux与vscode配置-CSDN博客 Json第三方库C项目——集群聊天服务器项目(二)Json第三方库…

mysql 用户管理-账户管理

学习了《mysql 用户管理-权限表》。接着学习更常用的的账户管理。 2&#xff0c;账户管理 MySQL提供许多语句用来管理用户账号,这些语句可以用来管理包括登录和退出MySQL服务器、创建用户、删除用户、密码管理和权限管理等内容。MySQL 数据库的安全性&#xff0c;需要通过账户管…
最新文章