Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >(带图易懂版)二叉搜索树(Key/Value)--C++

(带图易懂版)二叉搜索树(Key/Value)--C++

作者头像
小志biubiu
发布于 2025-02-27 13:02:15
发布于 2025-02-27 13:02:15
13800
代码可运行
举报
运行总次数:0
代码可运行
树代码实现

一、二叉搜索树的概念

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: • 若它的左子树不为空,则左子树上所有结点的值都小于等于根结点的值 • 若它的右子树不为空,则右子树上所有结点的值都大于等于根结点的值 • 它的左右子树也分别为二叉搜索树 • 二叉搜索树中可以支持插入相等的值,也可以不支持插入相等的值,具体看使用场景定义,后续学习的map/set/multimap/multiset系列容器底层就是二叉搜索树,其中map/set不支持插入相等值,multimap/multiset支持插入相等值 。

二、二叉搜索树的性能分析

  1. 最优情况下,二叉搜索树为完全二叉树(或者接近完全二叉树),其高度为: O(log2 N)
  2. 最差情况下,二叉搜索树退化为单支树(或者类似单支),其高度为: O(N/2)
  3. 所以综合而言二叉搜索树增删查改时间复杂度为: O(N)

那么这样的效率显然是无法满足我们需求的,我们后续继续学习二叉搜索树的变形,平衡二叉搜索树AVL树和红黑树,才能适用于我们在内存中存储和搜索数据。 另外需要说明的是,二分查找也可以实现 O(logN) 级别的查找效率,但是二分查找有两大缺陷:

  1. 需要存储在支持下标随机访问的结构中,并且有序。
  2. 插入和删除数据效率很低,因为存储在下标随机访问的结构中,插入和删除数据一般需要挪动数据。 这里也就体现出了平衡二叉搜索树的价值。

三、二叉搜索树的插入

插入的具体过程如下:

  1. 树为空,则直接新增结点,赋值给root指针
  2. 树不空,按二叉搜索树性质,插入值比当前结点大往右走,插入值比当前结点小往左走,找到空位置,插入新结点。
  3. 如果支持插入相等的值,插入值跟当前结点相等的值可以往右走,也可以往左走,找到空位置,插入新结点。(要注意的是要保持逻辑一致性,插入相等的值不要一会往右走,一会往左走)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 int a[] = {8, 3, 1, 10, 6, 5, 7, 14, 12};

四、二叉搜索树的查找

  1. 从根开始比较,查找x,x比根的值大则往右边走查找,x比根值小则往左边走查找。
  2. 最多查找高度次,走到到空,还没找到,这个值不存在。
  3. 如果不支持插入相等的值,找到x即可返回
  4. 如果支持插入相等的值,意味着有多个x存在,一般要求查找中序的第一个x。如下图,查找3,要找到1的右孩子的那个3返回。

五、二叉搜索树的删除

⾸先查找元素是否在二叉搜索树中,如果不存在,则返回false。 如果查找元素存在则分以下四种情况分别处理:(假设要删除的结点为N)

  1. 要删除结点N左右孩子均为空
  2. 要删除的结点N左孩子位空,右孩子结点不为空
  3. 要删除的结点N右孩子位空,左孩子结点不为空
  4. 要删除的结点N左右孩子结点均不为空

对应以上四种情况的解决方案

  1. 把N结点的父亲对应孩子指针指向空,直接删除N结点(情况1可以当成2或者3处理,效果是一样的)
  2. 把N结点的父亲对应孩子指针指向N的右孩子,直接删除N结点
  3. 把N结点的父亲对应孩子指针指向N的左孩子,直接删除N结点
  4. 无法直接删除N结点,因为N的两个孩子无处安放,只能用替换法删除。找N左子树的值最大结点R(最右结点)或者N右子树的值最小结点R(最左结点)替代N,因为这两个结点中任意一个,放到N的位置,都满足二叉搜索树的规则。替代N的意思就是N和R的两个结点的值交换,转而变成删除R结点,R结点符合情况2或情况3,可以直接删除。

六、二叉搜索树的实现代码

Key二叉搜索树的实现代码

七、二叉搜索树key和key/value使用场景

1、key搜索场景:

只有key作为关键码,结构中只需要存储key即可,关键码即为需要搜索到的值,搜索场景只需要判断key在不在。key的搜索场景实现的二叉树搜索树支持增删查,但是不支持修改,修改key破坏搜索树结构了。

  1. 场景1:小区无人值守车库,小区车库买了车位的业主车才能进小区,那么物业会把买了车位的业主的车牌号录入后台系统,车辆进入时扫描车牌在不在系统中,在则抬杆,不在则提示非本小区车辆,无法进入。
  2. 场景2:检查一篇英文文章单词拼写是否正确,将词库中所有单词放入二叉搜索树,读取文章中的单词,查找是否在二叉搜索树中,不在则波浪线标红提示。

2、key/value搜索场景:

每一个关键码key,都有与之对应的值value,value可以任意类型对象。树的结构中(结点)除了需要存储key还要存储对应的value,增/删/查还是以key为关键字走二叉搜索树的规则进行比较,可以快速查找到key对应的value。key/value的搜索场景实现的二叉树搜索树支持修改,但是不支持修改key,修改key破坏搜索树结构了,可以修改value。

  1. 场景1:简单中英互译字典,树的结构中(结点)存储key(英文)和vlaue(中文),搜索时输入英文,则同时查找到了英文对应的中文。
  2. 场景2:商场无人值守车库,入口进场时扫描车牌,记录车牌和入场时间,出口离场时,扫描车牌,查找入场时间,用当前时间-入场时间计算出停车时长,计算出停车费用,缴费后抬杆,车辆离场。
  3. 场景3:统计一篇文章中单词出现的次数,读取一个单词,查找单词是否存在,不存在这个说明第一次出现,(单词,1),单词存在,则++单词对应的次数。

3、key/value二叉搜索树代码实现

Key/Value二叉搜索树代码实现

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【物联网】光影之谜:RGB-LED传感器引领科技变革之路
物联网(Internet of Things,IoT)是一项引领科技前沿的技术奇迹,通过互联网技术将各类实体物体、传感器、软件等连接起来,构建起一个巨大的网络体系,使得这些设备能够以高度协同的方式实现信息的互通和共享。
SarPro
2024/02/20
3310
【物联网】光影之谜:RGB-LED传感器引领科技变革之路
【物联网】液滴即信息:雨滴探测传感器实验解析降雨的密码
物联网(Internet of Things,IoT)是一项引领科技前沿的技术奇迹,通过互联网技术将各类实体物体、传感器、软件等连接起来,构建起一个巨大的网络体系,使得这些设备能够以高度协同的方式实现信息的互通和共享。
SarPro
2024/02/20
2640
【物联网】液滴即信息:雨滴探测传感器实验解析降雨的密码
Arduino Sensor Shield v5 传感器扩展板
Sensor Shield V5.0适用于Uno,Mega 2560和类似外形的Arduino板,并提供了一种方便的方法来连接传感器和其他外围设备,例如伺服电机。
云深无际
2020/09/03
12.2K0
Arduino Sensor Shield v5 传感器扩展板
【物联网】数字交响:红外炫遥控,蜂鸣躁动,干簧管传感演绎科技交响曲
物联网(Internet of Things,IoT)是一项引领科技前沿的技术奇迹,通过互联网技术将各类实体物体、传感器、软件等连接起来,构建起一个巨大的网络体系,使得这些设备能够以高度协同的方式实现信息的互通和共享。
SarPro
2024/02/20
2400
【物联网】数字交响:红外炫遥控,蜂鸣躁动,干簧管传感演绎科技交响曲
Arduino打造LED流水灯
灯红酒绿的城市,瓜果飘香的乡村,视觉与嗅觉灵敏者的贪婪享受,哪种更沉醉;让城市灯红酒绿的工人,让乡村瓜果飘香的农夫,哪个更伟大。
陈帅华
2019/07/25
1.6K0
Arduino打造LED流水灯
物联网-传感器原理实验
一般情况下光敏电阻的暗电阻为1M~~2MΩ,亮电阻为1K~~15KΩ,则可以根据P1.1处的电压:
会洗碗的CV工程师
2024/01/31
8490
物联网-传感器原理实验
Raspberry树莓派4B传感器入门开发板套件
2020年春节之前,出于好奇,也出于对机器人领域的兴趣,买了一个Raspberry树莓派4B传感器入门开发板套件。非常凑巧,受COVID-19疫情管控的需要,全国人民居家隔离。借着无法外出的空隙,就简单入门学习了一把,还是蛮有意思的。这周末下雨又困在家里,恰巧微信公众号发来消息,再不更新一下公众号,又得冻结我的账号了。哈哈,学习过程中强迫自己做做笔记挺好的。
zoujunjie202
2022/07/27
5980
Raspberry树莓派4B传感器入门开发板套件
FPGA开发板剁手,学生狗省钱大法丨吐血资源
博主Joel Williams在他的主页中分享了一篇购买便宜的FPGA开发板的攻略,量子位编译本文。
量子位
2018/08/08
2.2K0
物联网开发板各种各样,要怎么选择?
现在物联网比较火,家里有各种智能设备,智能灯,智能空调,智能音箱,不做点智能的电器都拿不出手了,所以我也想了解下,在查了一些资料总结了下面的一些开发板,希望能对新入手的和我一样的小白有帮助。废话不多说了,出发吧。
香菜聊游戏
2021/10/19
2.3K0
物联网开发板各种各样,要怎么选择?
树莓派基础实验10:干簧管传感器实验
   磁簧开关(Reed Switch)也称之为干簧管,它是一个通过所施加的磁场操作的电开关。基本型式是将两片磁簧片密封在玻璃管内,两片虽重叠,但中间间隔有一小空隙。当外来磁场时将使两片磁簧片接触,进而导通。 一旦磁体被拉到远离开关,磁簧开关将返回到其原来的位置。可以用来计数或限制位置。
张国平
2020/09/27
1.3K0
物联网智能车位锁的总体设计方案​
停车难已经成为影响城市交通发展的重要瓶颈,现 有 停车位数量不足,车位 资源利用率低,车 位信息不对称,空 闲车位共享难、车位管理水平落后等 因素是 导致停车难 的重要原因。
zhangjiqun
2024/12/17
1750
物联网智能车位锁的总体设计方案​
树莓派基础实验5:激光传感器实验
   由于其良好的指向性和能量集中性,激光广泛用于医疗军事等领域,顾名思义,激光发射模块是一种可以发射激光的模块。
张国平
2020/09/28
1.5K0
树莓派基础实验5:激光传感器实验
物联网-GPIO输入—按键检测
通过按键控制三个LED灯的关灭,按下按键k2,LED显示流水灯样式,按下按键k3,LED从新开始显示流水灯。
会洗碗的CV工程师
2024/02/07
4520
物联网-GPIO输入—按键检测
第7章_低成本 Modbus 传感器的实现
我们的 Modbus 传感器开发套件共有三个, 三个板子的使用的主控方案是 STM32F030芯片,硬件接口资源如下图所示:
韦东山
2024/06/29
2500
第7章_低成本 Modbus 传感器的实现
基于51单片机智能小车的设计与实现转弯避障_基于单片机的智能小车设计
学习智能小车系统,有助于提高搭建系统的能力和对自动控制技术的理解。智能小车是一个较为完整的智能化系统,而智能化的研究已成为我国追赶世界科技水平的重要任务。智能小车有它特有的特点:成本低,涉及的知识面广,易于拓展[1]。整个智能小车系统作为一个完整的系统,从它的原理图的实现到实物的完成的过程,不仅需要深厚的电子方面的知识,还有对电路实现的良好掌握,对于培养学生的实践能力都有重要的意义。智能小车的竞赛在我国各大高校中都受到了重视,吸引了大批的高校学生的兴趣,而且取得了很多优异的成果,为我国推进智能化的进程做出了巨大的贡献,也为智能汽车的发展提供了理论依据[2-3]。只有当把理论和模型应用到实践中,这样的创新才用意义,我们国家这几年在智能化方面的进步越来越快,也推动了我国在国际社会上在智能化方面的话语权。智能小车是智能化的一部分,它的系统里的避障、循迹、红外遥控的技术用到了智能化,将智能化应用到传统技术上是21世纪发展的趋势。我国虽然从改革开放以来大力发展科技创新,但是在智能化的创新水平与国外较发达的国家相比还有巨大的差距,智能竞赛在高校越来越流行,也证明了我国教育在这方面很快会赶上世界上的发展水平。本次设计是以单片机为CPU,通过编程和一些外围电路的设计来实现红外遥控,避障,循迹等功能。最重要的是把模型上的研究应用到实际生活中,智能车辆便做到了这一点[4-6]。在实际应用中比如在倒车的过程中实现的红外警报系统是以智能小车为模型而研发出来的。对于电子知识的热爱与钻研有利于研发更多智能车辆,使我们的生活更加便利、智能化。
全栈程序员站长
2022/11/02
2.4K0
1.3 选择适合的Arduino
Arduino发展到现在,已经有了众多型号和众多衍生控制器推出。在此,列出常用的控制器,做一下介绍。
喵叔
2020/09/08
1.7K0
1.3 选择适合的Arduino
树莓派基础实验7:倾斜开关实验
  在倾斜开关中球以不同的倾斜角度移动,以制造触发电路。倾斜开关模块使用双向传导的球形倾斜开关。当它向一侧倾斜时,只要倾斜度和力满足条件开关就会通电,从而输出低电平信号。
张国平
2020/09/27
1.3K0
15 元的 Arduino 实现低成本自动化控制
在今天的高度科技发展时代,自动化控制系统在各个领域中起着重要作用。而传统的自动化控制方案通常价格昂贵,不易掌握。本文将介绍一种低成本自动化控制方案,即使用 Arduino Uno,不仅价格亲民,而且易于使用,拥有灵活的扩展能力,但是相对于 PLC 稳定性略差,没有过长时间稳定运行案例,但对于对稳定性安全性要求不是很高的项目,可以是一个很有性价比的选择。
剑指工控
2023/11/09
5860
15 元的 Arduino 实现低成本自动化控制
C51 单片机开发震动传感器介绍
本文开始介绍新的内容,开始涉及一些外设,本次整理的是关于震动传感器的东西。传感器的使用并不复杂,只是多了接线的步骤。
码农UP2U
2024/04/18
2780
C51 单片机开发震动传感器介绍
C51 单片机开发振动传感器控制继电器
上篇文章整理了关于震动传感器的内容,震动传感器的输出相当于单片机的输入。那么今天要介绍的继电器。
码农UP2U
2024/04/19
1660
C51 单片机开发振动传感器控制继电器
推荐阅读
相关推荐
【物联网】光影之谜:RGB-LED传感器引领科技变革之路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验