当前位置: 首页 > news >正文

完整教程:从C++开始的编程生活(18)——二叉搜索树基础

前言

本系列文章承接C++基础的学习,需要有C语言的基础才能学会哦~
第18篇主要讲的是有关于C++的二叉搜索树基础
C++才起步,都很简单!!

目录

前言

二叉搜索树

性能分析

二叉搜索树的增删查改

插入

查询

删除

修改

二叉搜索树的key和key/value的搜索场景

key搜索场景

key/value搜索场景


二叉搜索树

具有以下性质的二叉树:

若左子树不为空,则左子树上所有结点    根结点的值
若右子树不为空,则右子树上所有结点    根结点的值
它的左右子树也分别为二叉搜索树

称之为二叉搜索树。特别的,空树也是二叉搜索树

也可以反过来,右 ≤ 根 ≤ 左。

                                                                                 图1

二叉搜索树,又叫二叉排序树

当我们将二叉搜素树中序(左根右)输出后,为升序数列
上图中序输出为:1,3,6,7,8,10,15,17,19,27,30。

那么顾名思义,这种结构的作用就是Ⅰ.便于搜索Ⅱ.便于排序

根据二叉搜索树的性质,我们在查找结点的时候最多只需要查找n次,n为树的层数,搜索速度很快。

性能分析

如图,结点大小和上图完全相同,但是排列情况不同,层数更大,但也是二叉搜索树。

                                                                              图2

这时的搜索,最多就要搜索11层,比原来多了7层!这说明二叉搜索树排列不同,搜索性能是不同的,波动很大,因此,我们实际上使用更多的是平衡二叉搜索树(如图1),这个后面再学,先按下不表。

二叉搜索树的增删查改

template
struct BSTNode
{K _key;BSTNode* _right;BSTNode* _left;BSTNode(const K& key):_key(key),_left(nullptr),_right(nullptr){}
};

                                                            二叉搜索树结点结构代码

插入

如果树为空,则直接新增结点,赋值给root指针
如果树不为空按照二叉搜索树性质大往右,小往左,找空插。插入值比当前结点大就往右走,插入值比当前结点小就往左走,找到空位插入新结点。
插入相等的值时,可以往右也可以往左,但是要注意保持一致性,要么都往右要么都往左。有相同的值,称为冗余,我们一般默认不存相同的数值。

但是如果进行了旋转子树的操作,那么即使插入时统一了,实际存储也不一定就是预料的那样。

boll Insert(const K& key)//默认不支持冗余
{if (_root == nullptr){_roor = new Node(key);return true;}Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key < key){parent = cur;cur = cur->_left;}else if (cur->_key > key){parent = cur;cur = cur->_right;}else{return false;}}cur = new Node(key);if (parent->_key < key){parent->_right = cur;}else{parent->_left = cur;}return true;
}

查询

无冗余查找:

bool Find(const K& key)
{Node* cur = _root;while (cur){if (cur->_key < key){cur = cur->_right;}else if (cur->_key > key){cur = cur->_left;}else{return true;}}return false;
}

存在冗余查找:

比如要求找到重复对象中的中序输出的第一个。

在上述代码的基础上,查找到相等数值的节点后不返回,继续在左子树中找目标对象,找到了再输出true

代码略······

删除

首先查找结点,在树中再进行删除。

情况①:删除的是叶子结点。
解决方法:直接释放删除

情况②:删除的结点只有一个孩子。
解决方法:让父结点的孩子指针指向孩子的孩子,然后再删除释放中间结点

情况③:删除的结点有两个孩子。
解决方法:用右子树的最小结点or左子树的最大结点替代该结点,替代完成后,再删除释放中间结点。

因为空树也能算是二叉搜索树所以我们可以把叶子结点当作是有两个孩子且都为空树的结点并且并到情况②中进行处理

bool Erase(const K& key)
{Node* parent = nullptr;Node* cur = _root;while (cur){
//先查找对象if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}//找到对象,准备删除else{//情况一和二合并以情况二的方法处理,if(cur->_left == nullptr){//删除根结点的特殊情况处理if (cur == _root){_root = cur->_right;}else{if (cur == parent->_right){parent->_right = cur->_right;}else{parent->left = cur->left;}}delete cur;return true;}else if (cur->_right == nullptr){//删除根结点的特殊情况处理if (cur == _root){_root = cur->_left;}else{if (cur == parent->_right){parent->_right = cur->_left;}else{parent->_left = cur->_left;}}delete cur;return true;}//情况三else{//找右子树最小结点替代Node* minRight = cur->_right;Node* minRightParent = cur;while (minRight->_left){minRightParent = minRight;minRight = minRight->_left;}cur->_key = minRight->_key;//进入了while循环if (minRightParent->left == minRight){minRightParent->_left = minRight->_right;}//未进入while循环else{minRightParent->_right = minRight->_right;}return true;delete minRight;}}}return false;
}

修改

二叉搜索树的关键码(作为排列根据的数值key)不可修改。否则可能会破坏二叉搜索树的规则。

修改操作只能修改关键值和父母孩子指针之外的成员变量,所以实际修改时,就是先查找再自定义修改可修改的值,没什么特别的。

二叉搜索树的key和key/value的搜索场景

key搜索场景

只有key作为关键码时进行的搜索。

此时,结构中只存储key就好了,key为用来排列二叉搜索树的依据。这种场景下的搜索场景支持增删查,但是不可以改,理由可见上文“修改”部分。

生活中使用场景:业主开车进小区停车场,扫描车牌,以车牌为关键码搜索该车牌是否为本小区车辆。

key/value搜索场景

每一个key关键码都有与之对应的值value,value可为任意对象。

此时,除了key,还要存储value。增删查依旧用key按照二叉搜索树的规则进行搜索,然后可以根据key找到对应的value。key不可修改,但是value可以。

生活中使用场景:简单中英文互译字典,可英文作key,中文作value;商城车库,以车牌号为key,车辆入场后value记录为入场时间,出场之后,以车牌号key查找到对应的入场时间,然后再用出场时间减去value的入场时间,得出停车时间,接着计算出停车费用,value修改为停车费用。

❤~~本文完结!!感谢观看!!接下来更精彩!!欢迎来我博客做客~~❤

http://www.jsqmd.com/news/384721/

相关文章:

  • Go - slog使用入门
  • 角色设定法降AI:让DeepSeek模仿你的写作风格,效果如何?
  • 凸优化数学基础笔记(二):二次型与正定矩阵
  • 2026年国内西瓜分选机优选榜单,这些品牌值得一看,无损选果机/小蕃茄分选机/冬枣选果机,分选机公司怎么选择 - 品牌推荐师
  • 去AIGC的HumanRestore引擎到底靠不靠谱?用了3个月的真实体验
  • Android创建LiteOrmManager类(2)
  • open air interface的phy_simultors编译过了
  • 光伏混合储能直流微网 基于动态演化控制的混合储能系统功率共享方法 A Dynamic Evol...
  • AI元人文:东方思想在AI时代的一次“拈花微笑”
  • [嵌入式系统-205]:调整PWM的占空比,本质上是调整不同频率分量的幅度,包括直流分量的幅度
  • 串联构型混合动力汽车Simulink仿真模型建模,正向仿真模型,采用成熟人车路软件架构,基于功...
  • 解决WordPress迁移后重定向到旧域名的问题
  • 看完就会:千笔,MBA论文写作神器!
  • 银河麒麟V10安装 zlib-1.2.11-20.ky10.x86_64教程(含依赖解决)
  • 数据挖掘(二) ----- Jupyter Notebook使用示例和常见问题:从0到1避坑指南(附完整代码)
  • 2026年口碑好的兴亚津腾水系滤膜/0.22um0.45微米滤膜人气实力厂商推荐 - 行业平台推荐
  • 2026年市面上靠谱的止回阀生产商推荐榜,手动蝶阀/气动调节阀/铸钢阀门/铸钢止回阀/电动蝶阀,止回阀厂家怎么选 - 品牌推荐师
  • 2026年靠谱的管道油水分离过滤器/高效活性炭除炭过滤器厂家信誉综合参考 - 行业平台推荐
  • 书生大模型强化学习 RL 实践(Internlm2.5-1.8B swift GRPO gsm8k) - 教程
  • 2026年新型高速印刷机加工厂挑选指南,教你避坑选优,评价高的高速印刷机优质品牌榜单更新 - 品牌推荐师
  • 横评后发现!最受喜爱的降AIGC网站 —— 千笔·专业降AI率智能体
  • 【RT-DETR涨点改进】全网独家首发、特征融合改进篇 | AAAI 2026 | 引入CDEM交叉动态增强模块,双向引导和融合,在低光图像增强中有效提升了图像的亮度,提升小目标和暗目标的检测准确率
  • 救命神器!千笔,普遍认可的AI论文写作软件
  • 这次终于选对AI论文平台,千笔·专业论文写作工具 VS 灵感ai,专科生专属!
  • 亲测好用 9个降AIGC工具测评:专科生降AI率必备神器
  • 2026年评价高的碗碟架厨房拉篮/转角厨房拉篮优质厂商精选推荐(口碑) - 行业平台推荐
  • 直接上结论:更贴合继续教育的降AI率网站,千笔 VS 灵感ai!
  • 2026年口碑好的广东多功能进口涂料/原装进口涂料厂家选购完整指南 - 行业平台推荐
  • 从此告别拖延! 降AIGC网站 千笔·降AIGC助手 VS 笔捷Ai 精准自考降重
  • 摆脱论文困扰!千笔AI,人气爆表的降AIGC软件