6.17验证二叉树(LC98-M)

算法:
中序遍历下,输出的二叉搜索树节点的数值是有序序列。
有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。
具体地:中序遍历时,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足 BST(Binary Search Tree,二叉搜索树),继续遍历;否则直接返回 false。
调试过程:

原因:函数没有返回值。
应该把if (!isValidBST(root.right)) return false; 改成 return isValidBST(root.right);
在递归调用中,当返回`true`时,表示当前节点及其子树是一个有效的二叉搜索树。由于二叉搜索树的定义要求左子树的所有节点都小于当前节点,右子树的所有节点都大于当前节点,因此只要发现任何一个子树不满足这个条件,就可以直接返回`false`,不需要再继续执行后面的逻辑。
这两种写法在功能上是等效的,但使用递归时,有时候我们可以更加简洁地表达逻辑。让我们来看看这两种写法的区别和优劣势:
`return isValidBST(root.right);`
这种写法直接返回`isValidBST(root.right)`的结果。如果`isValidBST(root.right)`返回`false`,那么当前的函数也会返回`false`。如果`isValidBST(root.right)`返回`true`,函数会立即中断,并将`true`作为结果返回,表示当前树是一个有效的二叉搜索树。
修改后:

原因:“中”处不应该return true,因为这样直接把这次递归打断了。我们的逻辑是:中序遍历时,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足 BST(Binary Search Tree,二叉搜索树),继续遍历;否则直接返回 false。
返回的要是false,只有false能打断这次递归。
修改后:

原因:在递归调用过程中未正确更新`pre`的值。
问题出现在对`pre`的更新上。在代码中,`pre`被声明为局部变量,并且在每次递归调用时都会重新初始化为`root.val`。这意味着每次递归调用时,`pre`都会被重置为当前节点的值,而不会保留之前节点的值。
为了解决这个问题,可以将`pre`声明为实例变量或者将其传递为参数,以便在递归调用中正确地维护前一个节点的值。
正确代码:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {long pre = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if (root == null) return true;//左if (!isValidBST(root.left)) return false;//中:处理逻辑,root.val比pre大if (root.val <= pre) {//逻辑不对,直接return falsereturn false;}//若没有return false,则继续遍历pre = root.val; //右return isValidBST(root.right);}
}
注意:
`long pre = Long.MIN_VALUE;`这行代码的作用是初始化一个`long`类型的变量`pre`,并将其赋值为`Long.MIN_VALUE`。
在这里,`Long.MIN_VALUE`是Java中`long`类型的最小值常量。这个值是−2^(63),即−9223372036854775808。通过将`pre`初始化为`Long.MIN_VALUE`,代码确保了在遍历过程中任何遇到的节点值都会大于这个初始值。这对于比较节点值来判断是否满足BST的性质非常重要。
因此,这行代码的作用是为中序遍历过程中用于比较的先前节点值`pre`进行初始化,以确保它在比较过程中具有一个合适的初始值。
Java中也有`Long.MAX_VALUE`常量,它表示`long`类型的最大值。`Long.MAX_VALUE`的值是2^(63)−1,即9223372036854775807。
时间空间复杂度:
时间复杂度分析
在这段代码中,对于每个节点,我们只需常数时间来检查其值是否大于前一个节点的值。因此,时间复杂度可以表示为 O(n),其中 n 是树中节点的数量。
空间复杂度分析
空间复杂度取决于递归调用的深度。在最坏的情况下,如果树是一个不平衡的树,递归调用的深度将是O(n)。因此,空间复杂度为 O(n)。
因此,给定代码的时间复杂度为 O(n),空间复杂度为 O(n)。
相关文章:
6.17验证二叉树(LC98-M)
算法: 中序遍历下,输出的二叉搜索树节点的数值是有序序列。 有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。 具体地:中序遍历时,判断当前节点是否大于中序遍历的前一个节点&a…...
【Linux】编译器-gcc/g++与调试器-gdb的使用
👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.gcc/g语法 2.gcc的使用及…...
Google Guava 散列工具使用详解
文章目录 散列哈希函数哈希码布隆过滤器 散列 Guava 提供了一组散列(哈希)相关的工具类和方法,包括哈希函数接口、哈希算法实现、哈希码(HashCode)类、布隆过滤器(BloomFilter)等等。 Guava 提…...
AIGC-文生视频
stable diffusion的前传: 轻松理解 VQ-VAE:首个提出 codebook 机制的生成模型 - 知乎近两年,有许多图像生成类任务的前沿工作都使用了一种叫做"codebook"的机制。追溯起来,codebook机制最早是在VQ-VAE论文中提出的。相比…...
java中Collectors.groupingBy返回实例?
在Java中,Collectors.groupingBy()是一个用于对流元素进行分组的收集器。它可以根据指定的分类函数对流元素进行分组,并返回一个Map对象,其中键是分组的标准,值是属于相应组的元素列表。 下面是一个使用Collectors.groupingBy()方…...
uniapp打包的h5项目多了接口调用https://api.next.bspapp.com/client
产生跨域问题。 这个实际上是因为该项目在manifest.json文件中勾选了‘uni统计配置’导致的,取消勾选就可以了。 如果是小程序项目,在小程序开发者工具中添加可信任域名就可以了。 可以看看下面这个链接内容 uni-app H5跨域问题解决方案(…...
探索跨境建站:如何借助软骨鱼SaaS平台快速搭建独立站
随着全球电子商务的蓬勃发展,作为一名资深的跨境电商从业者,我深知跨境建站服务需要与时俱进,不断迈向更高效、更智能的2.0时代。今天,我想和大家分享一个让我眼前一亮的解决方案——软骨鱼SaaS平台,这个平台彻底颠覆了…...
C语言-字符串输入输出
字符串赋值 char *t “title”;char *s;s t;并没有产生新的字符串,只是让指针s指向了t所指的字符串, 对s的任何操作就是对t做的 字符串输入输出 char string[8];scanf(“%s”, string);printf(“%s”, string);scanf读入一个单词(到空格…...
OpenHarmony 设备启动Logo和启动视频替换指南
前言 OpenHarmony源码版本:4.0release 开发板:DAYU / rk3568 一、Logo替换 替换其中的logo.bmp 和 logo_kernel.bmp文件 注意事项: 1、图片的分辨率需要和设备匹配 2、如果是非首次编译(存在缓存)需要将out目录删…...
Python中函数添加超时时间,Python中signal使用
from time import time, sleepimport signal# 模拟要删除5条数据,中间有超时的i 5# 超时后执行的方法def timeout_handler(signal, frame):# 引发异常raise TimeoutError("删除第" str(i) "条,超时!")# 或者执行其他操作,不往外抛异常(超时的函数不会被…...
【C语言】递归详解
目录 1.前言2. 递归的定义3. 递归的限制条件4. 递归举例4.1 求n的阶乘4.1.1 分析和代码实现4.1.2 画图演示 4.2 顺序打印一个整数的每一位4.2.1 分析和代码实现4.2.2 画图推演 4.3 求第n个斐波那契数 5. 递归与迭代5.1 迭代求第n个斐波那契数 1.前言 这次博客内容是与递归有关&…...
NSSCTF 文件上传漏洞题目
目录 [SWPUCTF 2021 新生赛]easyupload1.0 [SWPUCTF 2021 新生赛]easyupload2.0 [SWPUCTF 2021 新生赛]easyupload3.0 [SWPUCTF 2021 新生赛]easyupload1.0 这是一个文件上传漏洞的题目 我们的思路是上传一句话木马,用工具进行连接 先编写一句话木马 将文件后缀…...
layui+ssm实现数据表格双击编辑更新数据
layui实现数据表格双击编辑数据更新 在使用layui加载后端数据请求时,对数据选项框进行双击即可实现数据的输入编辑更改 代码块 var form layui.form, table layui.table,layer parent.layer undefined ? layui.layer : parent.layer,laypage layui.laypag…...
windows下DSS界面本地集成linkis管理台
说明:当前开发环境为windows,node版本使用16.15.1。启动web时,确保后端服务已准备就绪。 1.linkis web编译 #进入项目WEB根目录 $ cd linkis/linkis-web #安装项目所需依赖 $ npm install参考官方编译说明,windows下编译一直异常…...
基于PaddleSeg开发的人像抠图web api接口
前言 基于PaddleSeg开发的人像抠图web api接口,提取官方代码,适配各种系统,通过api的接口进行访问。 环境要求 1、Python3.7以上 2、源码(文章最后下载) 源码结构 测试module.py中添加如下代码: if __na…...
Python---面向对象的基本概念
对象 对象,object,现实业务逻辑的一个动作实体就对应着OOP编程中的一个对象! 所以:① 对象使用属性(property)保存数据!② 对象使用方法(method)管理数据! …...
cv2.threshold 图像二值化
图像二值化 whatparameters示例 what cv2.threshold是OpenCV中用于进行图像二值化的函数。它的作用是将输入图像的像素值转换为两个可能的值之一,通常是0(黑色)或255(白色),根据一个设定的阈值。图像二值化…...
CRM:提升营销效果的关键
一场成功的营销活动,可以帮助企业扩大知名度,获取大量的优质商机。作为专业的管理软件,CRM系统同样具备营销管理的能力,帮助企业实现营销活动的规划、执行和监控,提高营销效果。下面说说,CRM营销自动化对企…...
AIGC: 关于ChatGPT中基于API实现一个StreamClient流式客户端
Java版GPT的StreamClient 可作为其他编程语言的参考注意: 下面包名中的 xxx 可以换成自己的代码基于java,来源于网络,可修改成其他编程语言实现参考前文: https://blog.csdn.net/Tyro_java/article/details/134748994 1 )核心代码结构设计 …...
FutureTask
1. 作用 异步操作获取执行结果取消任务执行,判断是否取消执行判断任务执行是否完毕 2. demo public static void main(String[] args) throws Exception {Callable<String> callable () -> search();FutureTask<String> futureTasknew FutureTask&…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
