c++修炼之路之AVL树与红黑树

news2024/11/10 7:40:09

目录

一:AVL树

1.AVL树的概念

2.AVL树插入数据后平衡因子及更新的情况

3.AVL树节点的定义 

4.AVL树的插入及旋转 

二:红黑树 

1.红黑树的概念及性质

2.红黑树节点的定义

3.红黑树的插入操作情况 

4.红黑树与AVL树的比较

 接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧

一:AVL树

1.AVL树的概念

二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查
找元素相当于在顺序表中搜索元素,效率低下
。因此,两位俄罗斯的数学家G.M.Adelson-Velskii
和E.M.Landis在1962年
发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右
子树高度之差的绝对值不超过1
(需要对树中的结点进行调整),即可降低树的高度,从而减少平均
搜索长度。

AVL树满足的性质:

1.   它的左右子树都是AVL树
2.   左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1) (平衡因子=右子树高度-左子树高度)

3.   如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有n个结点,其高度可保持在
    O(log_2 n),搜索时间复杂度O(log_2 n)

2.AVL树插入数据后平衡因子及更新的情况

插入节点时,会影响部分祖先节点的平衡因子,此时就需要更新平衡因子

插入在左树,平衡因子--        插入在右树,平衡因子++

此时就需要考虑是否继续往上更新祖先,要看当前节点的parent节点所在子树的高度是否发生变化

3.AVL树节点的定义 

template<class K,class V>
class AVLTreeNode
{
public:
	AVLTreeNode(const pair<K,V>& kv)
		:_kv(kv)
		,_left(nullptr)
		,_right(nullptr)
		,_parent(nullptr)
		,_bf(0)
	{}
private:
	pair<K, V> _kv;
	AVLTreeNode<K, V>* _left;
	AVLTreeNode<K, V>* _right;
	AVLTreeNode<K, V>* _parent;

	int bf;//平衡因子
};

4.AVL树的插入及旋转 

旋转的原则:保持搜索树的规则;控制平衡,降低高度

 对于AVL树的旋转分为四种情况:

1.新节点插入较高右子树的右侧---左单旋(单纯右边高)

abc是高度为h(h>=0)的AVL子树  

这里画的是抽象图,为了方便理解,这里可以画一些具象图

2.新节点插入较高左子树的左侧--右单旋(单纯左边高) 

 3.新节点插入较高左子树的右侧---左右:先左单旋再右单旋

具象图分析:

4.新节点插入较高右子树的左侧---右左:先右单旋再左单旋

 相关插入及旋转代码

 https://gitee.com/lin-ciyu/cplusplus/tree/master/AVLTree/AVLTree

双旋平衡因子的更新情况 

二:红黑树 

1.红黑树的概念及性质

1.红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或
Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路
径会比其他路径长出俩倍,因而是接近平衡的

2.红黑树的性质

1. 每个结点不是红色就是黑色
2. 根节点是黑色的
3. 如果一个节点是红色的,则它的两个孩子结点是黑色的 (一条路径中没有连续的红色节点)
4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点(每条路径的黑色节点数量是相等的)
5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点(NIL节点))

思考:为什么满足上面的性质,红黑树就能保证:其最长路径中节点个数不会超过最短路径节点
个数的两倍

此时考虑极端情况:  最短路径为全黑(高度为h),最长路径为一黑一红(高度为2*h),

一定满足最短路径*2>=最长路径,其它的情况下都是满足最短路径*2>最长路径

但在实际当中最短路径和最长路径不一定存在

2.红黑树节点的定义

enum Colour
{
	RED,
	BLACK
};

template<class K,class V>
struct RBTreeNode
{
	pair<K, V> _kv;
	RBTreeNode<K, V>* _left;
	RBTreeNode<K, V>* _right;
	RBTreeNode<K, V>* _parent;
	Colour _col;

	RBTreeNode(const pair<K,V>& kv)
		:_left(nullptr)
		,_right(nullptr)
		,_parent(nullptr)
		,_kv(kv)
	{}
};

对于这里新插入节点的颜色是给红色的,给黑色的话,就会违反性质4,并且会更麻烦,而给红色的话,可能会违反性质3,但通过调整就可以改变

3.红黑树的插入操作情况 

因为新节点的默认颜色是红色,因此:如果其双亲节点的颜色是黑色,没有违反红黑树任何
性质,则不需要调整;但当新插入节点的双亲节点颜色为红色时,就违反了性质三不能有连
在一起的红色节点,此时需要对红黑树分情况来讨论:
约定:cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点

情况一: cur为红,p为红,g为黑,u存在且为红

如果g是根节点的话,在调整完成后,将g改为黑色

如果g是子树,g一定有双亲,且g的双亲如果为红色,需要继续网上调整

解决方式:将p,u改为黑,g改为红,然后把g当成cur,继续向上调整

 部分具象图分析:

情况二: cur为红,p为红,g为黑,u不存在/u存在且为黑

 

解决方式:p为g的左孩子,cur为p的左孩子,则进行右单旋转;相反,
p为g的右孩子,cur为p的右孩子,则进行左单旋转
p、g变色--p变黑,g变红 

p为g的左孩子,cur为p的右孩子,则针对p做左单旋转;相反,
p为g的右孩子,cur为p的左孩子,则针对p做右单旋转,转换成上面的情况

部分具象图分析:

 相关实现及测试代码

https://gitee.com/lin-ciyu/cplusplus/tree/master/RBTree/RBTree

4.红黑树与AVL树的比较


红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O($log_2 N$),红黑树不追
求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数,
所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用中红
黑树更多 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2128413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多方位实测运动耳机排行榜前十名,助你选出靠谱的运动耳机!

非常荣幸能与各位运动爱好者共聚本次的骨传导耳机知识分享&#xff01;作为一名深耕运动科技领域多年的专家&#xff0c;今天将主要跟大家分析一下市面上比较热门的骨传导耳机。骨传导耳机作为当下市面上非常新颖且有创意的耳机种类&#xff0c;相信有很多用户都想入手一款&…

流片为啥那么重要?

很多微电子与集成电路专业的学生、初入IC职场的工程师&#xff0c;以及电子/机械大类专业的同学&#xff0c;在进入芯片设计行业时&#xff0c;都或多或少听说了参与流片的重要性。 但是却并不是很清楚——流片到底有多重要&#xff1f;流片为什么重要&#xff1f; 研0的同学…

从基础到进阶:利用EasyCVR安防视频汇聚平台实现高效视频监控系统的五步走

随着科技的飞速发展&#xff0c;视频监控技术在社会安全、企业管理、智慧城市构建等领域扮演着越来越重要的角色。一个高效智能的视频监控管理系统不仅能够提升监控效率&#xff0c;还能在预防犯罪、事故预警、数据分析等方面发挥巨大作用。 一、需求分析 在设计视频监控管理…

存在分包的微信小程序解包反编译还原(含报错处理与代码修复)

01前言 本文主要对微信小程序的解包步骤进行复现梳理&#xff0c;网上虽然已有明确详细的文章&#xff0c;但是实际复现过程中程序报错的情况并不少见。对此情况进行了梳理以及对相关工具的代码、调用方式等进行了优化修复。 本文内容&#xff1a; 常规微信小程序逆向解析的…

el-input设置后缀显示单位并阻止滚轮微调

项目中收集form表单信息时&#xff0c;有时会需要在el-input后面显示单位&#xff0c;效果如图&#xff1a; 当然&#xff0c;我们可以直接在输入框后面加上单位&#xff0c;但直接给输入框上加单位不管是视图上还是用户体验上看起来都要好一点 element-plus / element-ui给我…

MySQL数据库 — Explain命令

EXPLAIN 命令在 MySQL 查询优化中发挥了重要作用。通过 EXPLAIN 的输出&#xff0c;可以获取有关查询执行计划的详细信息&#xff0c;从而有助于优化和调试查询。不过&#xff0c;它也有一定的局限性。 使用Explain EXPLAIN 语句通过在查询前加上 EXPLAIN 关键字来展示查询的…

正则表达式三板斧

推荐练习网站&#xff1a;https://regex101.com/ 解释一下: 1、最常用的就是[]&#xff0c;表示匹配任意字符&#xff0c;[]中所有的变量只需要输入一次&#xff08;比如搜索三个点…&#xff0c;只需要输入[.]即可&#xff09; 2、*表示>0次&#xff0c;表示>1次&#x…

计算机毕业设计选题推荐-推拿知识互动平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

大白话!解析大模型原理!

LLM的工作原理对大多数人来说是个谜。虽然它们本质上在于“预测下一个词”&#xff0c;并需要大量文本进行训练&#xff0c;但具体细节往往令人困惑。原因在于这些系统独特的开发方式&#xff1a;**基于数十亿词汇训练的神经网络&#xff0c;不同于传统的人类编写的软件。**尽管…

SpringCache源码解析(三)——@EnableCaching

一、源码阅读 让我们进行源码阅读把。 1.1 阅读源码基础&#xff1a; Import(xxx.class)里的类可以有两种类&#xff1a; ImportSelector接口的实现类&#xff1b;ImportBeanDefinitionRegistrar接口的实现类&#xff1b; 两种接口简介&#xff1a; ImportSelector接口&am…

如何在算家云搭建Open-Sora1.0

一、模型介绍 2024 年 3 月 18 日&#xff0c;Colossal-AI 团队发布了 Open-Sora 1.0 项目&#xff0c;该项目是一个全面开源的视频生成模型项目&#xff0c;项目旨在高效制作高质量视频&#xff0c;并使所有人都能使用其模型、工具和内容。 模型架构 &#xff1a; Open-Sor…

ubuntu20.04 编译vtk 9.3.1+vtkDicom+GDCM 3.0.24

1 下载vtk源码 链接地址如下&#xff1a; Download | VTK 使用cmake-gui编译&#xff08;如何安装使用&#xff0c;查看前两篇文章&#xff09;&#xff0c;运行命令&#xff1a; cmake-gui 如下图所示&#xff0c;选择源码目录和build目录&#xff1a; 勾选 BUILD_SHARED…

基于SpringBoot+Vue+MySQL的志愿服务管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着社会对志愿服务需求的日益增长&#xff0c;传统的志愿服务管理方式已难以满足高效、透明、精准的管理需求。为提升志愿服务组织的运营效率&#xff0c;优化资源配置&#xff0c;增强志愿者参与度和满意度&#xff0c;开发基…

项目启动 | 盘古信息携手晶捷电子,开启数字化生产管理新纪元

随着智能制造技术的不断成熟与普及&#xff0c;一个全新的制造业时代已经到来&#xff0c;智能制造已成为推动全球制造业转型升级的重要引擎。在日新月异的市场环境中&#xff0c;传统制造业更需加快转型升级的步伐&#xff0c;以智能化、精细化的生产模式&#xff0c;实现生产…

昆仑联通8000万补流全砍:曾分红近亿,应收账款周转率连年下滑

《港湾商业观察》廖紫雯 日前&#xff0c;北京昆仑联通科技发展股份有限公司&#xff08;以下简称&#xff1a;昆仑联通&#xff09;拟冲刺北交所&#xff0c;保荐机构为东方证券。 2023年6月29日&#xff0c;昆仑联通于上交所递交招股书&#xff0c;拟冲刺沪市主板&#xff…

混淆矩阵与 ROC 曲线:何时使用哪个进行模型评估

必须在机器学习和数据科学中评估模型性能&#xff0c;才能提出一个可靠、准确和高效的模型来进行任何类型的预测。一些常见的工具是 Confusion Matrix 和 ROC Curve。两者具有不同的用途&#xff0c;确切地知道何时使用它们对于稳健的模型评估至关重要。在这篇博客中&#xff0…

【nginx】转发配置、漏洞整改

转发配置 常见的接口调用配置&#xff1a; location /com_api/ {proxy_set_header X-Real-IP $remote_addr;proxy_set_header Host $http_host;proxy_pass http://后端服务IP:后端服务端口号/; }若转发调不通时&#xff08;常出现在调用第三方系统时&#xff09;&#xff0c;…

大数据 - OLAP与OLTP的区别

前言 联机事务处理OLTP&#xff08;on-line transaction processing&#xff09;和 联机分析处理OLAP&#xff08;On-Line Analytical Processing&#xff09;。 OLTP&#xff0c;主要是面向传统的“增删改查”事务系统&#xff0c;数据大都是以实体对象模型来存储数据&#…

Java设计模式—面向对象设计原则(二) --------> 里氏代换原则 LSP (完整详解,附有代码+案列)

文章目录 里氏代换原则3.2.1 概述3.2.2 改进上述代码 里氏代换原则 3.2.1 概述 里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则&#xff1a;任何基类可以出现的地方&#xff0c;子类一定可以出现。通俗理解&#xff1a;子类可以扩展父类的功能&#xff0c;但不能…

快速同步与问题解决:每日站立会议的实用指南

每日站会不管是在大型企业中&#xff0c;还是在中小型企业中都是每日必备的一种晨会。但并不是所有的企业都能够正确使用每日站会&#xff0c;较多的企业在每日站会中总会偏离每日站会的使用目的&#xff0c;从而变成了一个偏向于教育批评的会议。本篇文章中&#xff0c;让我们…