算法通关村第九关——中序遍历与搜索树
1 中序遍历和搜索树原理
二叉搜索树按照中序遍历正好是一个递增序列。其比较规范的定义是:
- 若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;
- 若它的右子树不为空,则右子树所有节点的值均大于它的根节点的值;
- 它的左、右子树也分别为二叉搜索树,比如下面的例子:

这两棵树的中序遍历分别是[1, 2, 3, 4, 5, 6, 7, 8, 9]和[6, 7, 8, 9],都是二叉搜索树。
2 二叉搜索树中搜索特定值
力扣700题,给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
比如target为3,给定二叉搜索树:
5/ \3 4/ \1 2
应该返回如下子树:
3 / \1 2
2.1 递归实现
使用递归来实现,先来分析一下有哪些情况:
- 如果根节点
root === null或者root.val === target就直接返回根节点; - 如果
target < root.val,说明比右子树的值小,去根节点的左子树进行查找searchBST(root.left, target); - 如果
target > root.val,说明比左子树的值大,去根节点的右子树进行查找searchBST(root.right, target)。
递归完整代码如下:
// 递归法
function searchBST(root, target) {// 如果根节点为空或者root.val === target,直接返回rootif (root === null || root.val === target) {return root;}// 如果target < root.val,进入根节点的左子树查找// 如果target > root.val,进入根节点的右子树查找return target < root.val ? searchBST(root.left, target) : searchBST(root.right, target);
}
2.2 迭代实现
迭代逻辑:
- 如果根节点
root === null或者root.val !== target,进入下面的判断- 如果
target < root.val,说明比右子树的值小,去根节点的左子树进行查找,root = root.left; - 如果
target > root.val,说明比左子树的值大,去根节点的右子树进行查找,root = root.right
- 如果
迭代完整代码如下:
// 迭代法
function searchBST(root, target) {// 如果根节点为空或者target !== root.valwhile (root !==null && target !== root.val) {// 如果target < root.val,进入根节点的左子树查找,root = root.left// 如果target > root.val,进入根节点的右子树查找,root = root.rightroot = (target < root.val ? root.left : root.right);}return root;
}
3 验证二叉搜索树
力扣98题,给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效二叉树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
分析:根据题目以及中序遍历的特性,可以知道二叉搜索树中序遍历得到的序列是一个升序序列,要判断是否是一个有效二叉树,只需要在中序遍历的时候一边遍历一边检查当前节点的值是否大于前一个遍历到的节点值即可。
3.1 递归实现
递归实现,代码如下:
function isValidBST(root) {let pre = Number.MIN_SAFE_INTEGER;return validBST(root);function validBST(node) {if (node === null) {return true;}// 如果左子树某个元素不满足要求就退出if (!validBST(node.left)) {return false;}// 如果当前节点值≤中序遍历前一个节点的值,不能满足二叉搜索树条件if (node.val <= pre) {return false;}pre = node.val;return validBST(node.right);}
}
3.2 迭代实现
测试用例的最小节点有可能是javascript中的最小值,因此初始化preVal = -Infinity。
function isValidBST(root) {const nodeStack= [];let preVal = -Infinity;while (nodeStack.length !== 0 || root !== null) {while (root !== null) {nodeStack.push(root);// 先遍历左子树root = root.left;}// 比较左子树中间根节点与前一个节点的值,如果小与前一个节点值,说明不是二叉搜索树root = nodeStack.pop();if (root.val <= preVal) {return false;}preVal = root.val;// 再遍历右子树root = root.right;}return true;
}
相关文章:
算法通关村第九关——中序遍历与搜索树
1 中序遍历和搜索树原理 二叉搜索树按照中序遍历正好是一个递增序列。其比较规范的定义是: 若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不为空,则右子树所有节点的值均大于它的根节点的值&…...
测试框架pytest教程(5)运行失败用例-rerun failed tests
# content of test_50.py import pytestpytest.mark.parametrize("i", range(50)) def test_num(i):if i in (17, 25):pytest.fail("bad luck") 运行这个文件,2个失败,48个通过。 要运行上次失败的测试用例,可以使用--l…...
【车载开发系列】UDS当中的时间参数
【车载开发系列】UDS当中的时间参数 UDS当中的时间参数 【车载开发系列】UDS当中的时间参数一. 术语定义二. 网络层时间调整参数三. ECU诊断层与会话层参数 一. 术语定义 缩写全称中文说明BSBlock Size块大小STminSeparation time min时间间隙SIService Identifier服务标识符S…...
PDF中的表格怎么转换为Excel?这两个工具一定得收藏!
PDF是一种常见的文件格式,它可以保持文件的原始样式和内容,但是也有一些缺点,比如不易编辑和处理数据。如果你想要将PDF中的表格或数据导出到Excel中,以便进行分析、计算或制作图表,那么你可能需要一个专业的PDF转Exce…...
ssh scp sshpass
ssh命令用于远程连接主机 ssh usernamehostname更多用法参考: ssh常用用法 scp 命令是用于通过 SSH 协议安全地将文件复制到远程系统和从远程系统复制文件到本地的命令 比如: scp /data/log/a.txt root192.168.1.100:/data/log该命令就就将本地的a.t…...
leetcode 1996. 游戏中弱角色的数量(排序的魅力)
题目 题意: 给定n个人的攻击力和防御力,对于一个人来说,如果存在某个人的攻击力和防御力都比他高,那么称这个人为弱角色。统计弱角色的数量 思路: 排序,攻击力按从大到小排序,这样遍历的时候某个数时前边的攻击力都比他…...
从头到尾说一次 Spring 事务管理(器) | 京东云技术团队
事务管理,一个被说烂的也被看烂的话题,还是八股文中的基础股之一。 本文会从设计角度,一步步的剖析 Spring 事务管理的设计思路(都会设计事务管理器了,还能玩不转?) 为什么需要事务管理&…...
php 系列题目,包含查看后端源代码
一、弱类型比较问题 原则: 1.字符串和数字比较,字符串回被转换成数字。 "admin" 0(true) admin被转换成数字,由于admin是字符串,转换失败,变成0 int(admin)0,所以比较结果是ture 2.混合字符串转…...
令牌桶C语言代码实现
令牌桶实例 令牌桶三要素 cps 每秒钟传输字节数 burst 令牌桶内最多能传输的字节数,token的最大值 token 令牌的个数 之前是一个令牌(token)对应一个字节,现在将一个token变为一个cps,cps是解码速率,每攒到一个令牌ÿ…...
Mybatis 建立依赖失败:报错Dependency ‘mysql:mysql-connector-java:8.0.28‘ not found
Mybatis 建立依赖失败:报错Dependency ‘mysql:mysql-connector-java:8.0.28’ not found 解决办法: 写完依赖代码,直接重构,下载依赖。 图片: 和 UUID(Universally Unique Identifier)都是用于生成唯一标识符的方法,但它们在实现和适用场景上存在一些区别。 雪花算法: 雪花算法是Twitter开发的一种分布式ID生成算法…...
docker之DockerFile与网络
目录 DockerFile 构建步骤 基础知识 指令 实战:构建自己的centos 第一步:编写dockerfile文件 第二步:构建镜像文件 docker网络 原理 功能 网络模式 host模式 container模式 none模式 bridge模式 DockerFile dockerfile 是用来…...
知识蒸馏开山之作(部分解读)—Distilling the Knowledge in a Neural Network
1、蒸馏温度T 正常的模型学习到的就是在正确的类别上得到最大的概率,但是不正确的分类上也会得到一些概率尽管有时这些概率很小,但是在这些不正确的分类中,有一些分类的可能性仍然是其他类别的很多倍。但是对这些非正确类别的预测概率也能反…...
centos 7 安装 docker-compose curl 设置代理
sudo curl -x “http://192.168.1.2:3128” 需要验证的代理 sudo curl -x “http://username:password192.168.1.2:3128” 1.下载 sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/lo…...
3D姿态相关的损失函数
loss_mpjpe: 计算预测3D关键点与真值之间的平均距离误差(MPJPE)。 loss_n_mpjpe: 计算去除尺度后预测3D关键点误差(N-MPJPE),评估结构误差。 loss_velocity: 计算3D关键点的速度/移动的误差,评估运动的平滑程度。 loss_limb_var: 计算肢体长度的方差,引导生成合理的肢体长度…...
ChatGPT取代人类仍然是空想?有没有一种可能是AI在迷惑人类
ChatGPT自从去年发布以来,就掀起了这些大语言模型将如何颠覆一切的激烈讨论,从为学生写作文、输出SEO文章,甚至取代谷歌成为世界上最受欢迎的搜索引擎,影响领域无所不包,甚至可能取代编剧、小说家和音乐家等从事创意工…...
终极LoRaWAN服务器搭建指南:如何快速构建你的私有物联网网络
终极LoRaWAN服务器搭建指南:如何快速构建你的私有物联网网络 【免费下载链接】lorawan-server Compact server for private LoRaWAN networks 项目地址: https://gitcode.com/gh_mirrors/lo/lorawan-server 你是否想拥有一个完全可控的LoRaWAN物联网平台&…...
Hive与MySQL集成配置全流程解析
1. Hive与MySQL集成的核心价值 在企业级大数据环境中,Hive作为数据仓库工具经常需要处理PB级数据。但默认的Derby元数据库存在单会话限制和性能瓶颈,这正是MySQL大显身手的地方。我经历过多次生产环境迁移,将元数据从Derby切换到MySQL后&…...
从磁力线到最小磁阻:手把手拆解一个微型直流电机的内部‘磁路战争’
从磁力线到最小磁阻:手把手拆解一个微型直流电机的内部‘磁路战争’ 拆开一枚硬币大小的玩具电机,你会看到一场无声的物理博弈——磁力线像急于回家的士兵,不断寻找最短路径;而转子则是这场战役的指挥官,通过精确的旋…...
从标定板到生产线:OpenCV实战工业相机畸变校正全流程
1. 工业相机畸变:产线精度杀手的前世今生 第一次在产线上看到相机拍出来的零件尺寸和实物差了0.5毫米时,我盯着屏幕愣了三分钟——这个误差足以让整个自动化装配线变成废品生产线。工业相机的畸变就像近视眼没戴眼镜,看到的物体位置和形状都…...
从STM32开发手册中快速定位信息:文脉定序系统的嵌入式应用联想
从STM32开发手册中快速定位信息:文脉定序系统的嵌入式应用联想 作为一名在嵌入式领域摸爬滚打多年的工程师,我深知那种在动辄上千页的芯片手册里“大海捞针”的痛苦。比如,当你需要配置一个特定的定时器中断,或者想确认某个GPIO引…...
华为ENSP实战:手把手教你搭建住宅小区网络拓扑(附完整配置脚本)
华为ENSP实战:从零构建智能小区网络的全栈解决方案 当清晨第一缕阳光透过窗帘洒进房间,现代人睁开眼的第一件事往往是拿起手机查看消息——这种习以为常的场景背后,是无数个日夜运行的住宅小区网络在默默支撑。作为网络工程师,我…...
终极指南:ComfyUI-LTXVideo深度解析与高效视频生成实战
终极指南:ComfyUI-LTXVideo深度解析与高效视频生成实战 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo ComfyUI-LTXVideo 是专为LTX-2视频生成模型设计的强大ComfyUI…...
【SpringAI篇04】:从内存到MySQL,构建可重启的智能对话系统
1. 为什么需要从内存存储升级到数据库持久化 刚开始接触SpringAI开发时,很多开发者都会选择默认的内存存储方案。这种方案简单直接,不需要额外配置数据库,特别适合快速原型开发。但当你真正要把应用部署到生产环境时,就会发现内存…...
【第四周】论文精读:Frustratingly Simple Retrieval Improves Challenging, Reasoning-Intensive Benchmarks
极简检索即可大幅刷新高难度推理基准主流观点认为简单RAG无法提升MMLU、MATH、GPQA等高难度推理任务,甚至会损害性能;本文推翻这一共识,证明核心瓶颈并非检索范式,而是缺少高质量、广覆盖、可单机部署的检索库;提出COM…...
让 TDengine 在 JetBrains IDEs 里更像“原生数据库”一点
让 TDengine 在 JetBrains IDEs 里更像“原生数据库”一点 Author: ChangJin Wei (魏昌进) 最近我做了一个小插件,把 TDengine 接入到了 JetBrains IDEs 的数据库工具链里。 先埋个小提示:文末有彩蛋。 项目地址: GitHub: https://github.…...
