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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++之二叉搜索树:高效与美的极致平衡
我们现在想去找这个4,4比8小,那么我们就没必要去右子树进行查找了,我们直接在左子树进行查找就行了
凯子坚持C
2024/11/26
860
C++之二叉搜索树:高效与美的极致平衡
【数据结构】二叉搜索树
在数据结构专栏,笔者介绍了,单纯的二叉树实际意义并不大,但是单二叉树变成平衡二叉搜索树就会很有用,那么本文就先来介绍一下什么是二叉搜索树。
ZLRRLZ
2025/01/20
960
【数据结构】二叉搜索树
二叉搜索树实现教程:用C++实现数据存储与查找
最优情况下,⼆叉搜索树为完全⼆叉树(或者接近完全⼆叉树),其⾼度为:O(log2N) 最差情况下,⼆叉搜索树退化为单支树(或者类似单⽀),其⾼度为:O(N /2) 所以综合而言⼆叉搜索树增删查改时间复杂度为:O(N) 那么这样的效率显然是无法满⾜我们需求的,在后续当中还有平衡⼆叉搜索树AVL树和红⿊树,才能适用于我们在内存中存储和搜索数据。
用户11286421
2024/11/21
910
二叉搜索树实现教程:用C++实现数据存储与查找
【C++】二叉搜索树
int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13};
啊QQQQQ
2024/11/19
1380
【C++】二叉搜索树
【c++】二叉搜索树(BST)
每个节点有两个指针,分别指向它的左子节点和右子节点。如果子节点不存在,则这些指针为nullptr
用户11029103
2024/05/24
920
【c++】二叉搜索树(BST)
【C++】二叉搜索树(搜索二叉树)
本篇聊聊二叉搜索树,二叉树基本知识的详细讲解在【数据结构】二叉树 。
羚羊角
2025/02/12
900
【C++】二叉搜索树(搜索二叉树)
【C++高阶】二叉搜索树的全面解析与高效实现
二叉搜索树(BST,Binary Search Tree)又称二叉排序树,是一种特殊的二叉树,它或者是一棵空树,或者是具有以下性质的二叉树:
IsLand1314
2024/10/15
1300
【C++高阶】二叉搜索树的全面解析与高效实现
【C++】二叉搜索树
https://blog.csdn.net/hsy1603914691/article/details/146592632
风中的云彩
2025/04/11
960
【C++】二叉搜索树
DS进阶:二叉搜索树
1、 本身树形结构用来存储数据相比顺序表和链表来说并不占有优势,他的最大优势就在于查找优势,当我们有一些数据经常需要进行搜索和查找时,只要按照上图的性质存放在树形结构里,那么我们可以通过这个规律在查找的时候将原本需要O(N)的时间复杂度变成O(logN)。
小陈在拼命
2024/03/16
1020
DS进阶:二叉搜索树
【C++的剃刀】我不允许你还不会二叉搜索树BST
1. K模型:K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到 的值。 比如:给一个单词word,判断该单词是否拼写正确,具体方式如下:
小文要打代码
2024/10/16
880
【C++的剃刀】我不允许你还不会二叉搜索树BST
C++-你知道二叉搜索树吗?(循环版)
 在二叉搜索树中,右子树上的任意一个节点的值都大于当前节点的值,左子树上的任意一个节点的值都小于当前节点的值,所以查找值的时候效率就很高,在任意位置插入和删除数据也不需要挪动,而且搜索二叉树走中序遍历就是一个升序。
用户10923087
2024/03/02
1200
C++-你知道二叉搜索树吗?(循环版)
【C++ 学习篇】二叉搜索树
a. 若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值 b. 若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点的值
是预备程序员a
2024/12/25
750
【C++ 学习篇】二叉搜索树
C++二叉搜索树
【C++进阶学习】二叉树搜索树 零、前言 一、二叉搜索树概念 二、二叉搜索树的详解及模拟 1、二叉搜索树的结构 2、二叉树搜索树的构造和析构 3、二叉搜索树的查找 4、二叉搜索树的插入 5、二叉搜索树的删除 三、二叉搜索树的应用 零、前言 我们都知道二叉树只有附加上一些特性才具有实用的价值,而本章主要讲解二叉树进阶的内容-二叉搜索树 一、二叉搜索树概念 概念: 二叉搜索树(Binary Search Tree)又称二叉排序树,也称作二叉查找树它或者是一棵空树,或者是具有以下性质的二叉树 若
用户9645905
2022/11/30
3090
C++二叉搜索树
C++二叉搜索树与KV模型
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树
有礼貌的灰绅士
2023/04/12
4130
C++二叉搜索树与KV模型
【c++】二叉树进阶 > 二叉搜索树<K模型,KV模型>
首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情况:
用户10925563
2024/06/04
1210
【c++】二叉树进阶 > 二叉搜索树<K模型,KV模型>
【C++】二叉搜索树
二叉搜索树又称二叉排序树,可以简写成 BST,它或者是一棵空树,或者是具有以下性质的二叉树:
YoungMLet
2024/03/01
1310
【C++】二叉搜索树
【C++修炼之路】17.二叉搜索树
对于二叉搜索树来说,中序遍历就是排好序的形式,如果中序遍历之后需要换行,那可以用子函数的形式完成递归,并放在私有防止直接使用。
每天都要进步呀
2023/03/28
3580
【C++修炼之路】17.二叉搜索树
C++:二叉搜索树
二叉搜索树(BST, Binary Search Tree)又叫做二叉排序树,它可以是一颗空树,其性质如下:
二肥是只大懒蓝猫
2023/03/30
2750
C++:二叉搜索树
【C++】二叉搜索树
最优情况下,⼆叉搜索树为完全⼆叉树(或者接近完全⼆叉树),其⾼度为: O (log 2 N )
用户11290673
2024/09/25
930
【C++】二叉搜索树
【C++课程学习】:二叉搜索树
因为搜索二叉树也是二叉树,要定义左右两个节点指针。此时先以K树讲解。此时的节点结构为:
用户11396661
2024/12/09
1130
【C++课程学习】:二叉搜索树
相关推荐
C++之二叉搜索树:高效与美的极致平衡
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验