【C++深度探索】AVL树与红黑树的原理与特性

🔥 个人主页:大耳朵土土垚
🔥 所属专栏:C++从入门至进阶

这里将会不定期更新有关C/C++的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉

前言

  前面对map/multimap/set/multiset进行了简单的介绍,我们发现这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。

  而AVL树红黑树是常用的自平衡二叉搜索树。它们在插入、删除和查找操作上具有较好的性能,并且在各种应用场景中被广泛使用。

文章目录

  • 前言
  • 1.AVL树
    • 1.1 AVL树的定义
    • 1.2 AVL树的性质
    • 1.3 AVL树的节点
  • 2.红黑树
    • 2.1 红黑树的定义
    • 2.2 红黑树的性质
    • 2.3 红黑树的节点
  • 3.结语

1.AVL树

1.1 AVL树的定义

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


该平衡因子是由左子树的高度减去右子树的高度得来的(当然也可以选择使用右子树的高度减去左子树的高度),当平衡因子的大小大于等于2或小于等于-2时,说明左右高度差超过1,就需要旋转来维持平衡,这也是平衡因子的作用。

1.2 AVL树的性质

一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:

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

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

1.3 AVL树的节点

那么AVL树节点的内容除了左右子树的指针以及存储数据的类型,还需要保存该节点的平衡因子,也就是说AVL树每个节点都包含一个平衡因子,一旦该节点的平衡因子大于等于2或小于等于-2就需要进行旋转,维持平衡:

struct AVLTreeNode
{AVLTreeNode<T>* _pLeft;AVLTreeNode<T>* _pRight;AVLTreeNode<T>* _pParent;//父节点指针T _data;	//存储数据int _bf;   // 节点的平衡因子//默认构造函数AVLTreeNode(const T& data = T()): _pLeft(nullptr), _pRight(nullptr), _pParent(nullptr), _data(data), _bf(0){}
};

除了平衡因子,我们发现每个节点都保存了父节点的指针,这是因为旋转或删除一个节点之后,父节点的平衡因子可能也需要改变,所以需要保存。

2.红黑树

2.1 红黑树的定义

  红黑树,是一种自平衡的二叉搜索树,它在每个结点上增加一个存储位表示结点的颜色来保持平衡,每个节点的颜色可以是Red或Black。

2.2 红黑树的性质

红黑树的节点可以是红色或黑色,满足以下性质:

  • 根节点是黑色的。
  • 如果一个节点是红色的,则它的两个子节点都是黑色的。
  • 从任意节点到其每个叶子节点的路径上包含相同数量的黑色节点。
  • 所有叶子节点(NIL节点,即空节点)是黑色的。

如下图:



  红黑树通过对任何一条从根到叶子的路径上各个结点颜色的限制,确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。

这是因为根据红黑树的性质,其最短路径如果存在则应该是全部都是黑节点,最长路径如果存在则应该是一黑一红交错的路径,这样最长路径是无论如何都不会大于最短路径的两倍,也就相当于最长路径不会大于其他任何路径的两倍,保证了红黑树的相对平衡。

2.3 红黑树的节点

// 节点的颜色
enum Color { RED, BLACK };
// 红黑树节点的定义
template<class ValueType>
struct RBTreeNode
{RBTreeNode<ValueType>* _pLeft;		// 节点的左孩子RBTreeNode<ValueType>* _pRight;			// 节点的右孩子RBTreeNode<ValueType>* _pParent; // 节点的双亲(红黑树需要旋转,为了实现简单给出该字段)ValueType _data;		//节点的值域Color _color;			// 节点的颜色//默认构造函数RBTreeNode(const ValueType& data = ValueType(),Color color = RED): _pLeft(nullptr), _pRight(nullptr), _pParent(nullptr), _data(data), _color(color){}
};

红黑树的节点与AVL树一样需要父节点的指针,因为红黑树在插入新节点或删除节点时会出现不满足红黑树性质的情况,这时红黑树需要旋转来维持相对平衡,为了实现简单给出父节点指针。

此外对于默认构造函数,我们发现新增1一个节点默认给的是红色,这是因为如果给的是黑色,那么新增节点的路径上就多了一个黑色节点,为了满足红黑树所有路径上黑色节点数目相等就必须改变其他节点的颜色;而如果新增节点给的是红色,那么如果父节点是黑色我们就不需要做改动,如果父节点是红色我们才需要做改动,有一半的可能不需要改动,所以我们选择将新增节点默认设为为红色。

3.结语

  使用AVL树和红黑树时,可以按照二叉搜索树的规则进行插入、删除和查找操作。由于它们的自平衡特性,插入和删除操作可能需要进行旋转或颜色调整,以确保树的平衡性。这些操作可以保证树的高度保持在O(logn),从而提供了较好的性能。
  在实际应用中,AVL树和红黑树都可以用于需要高效的插入、删除和查找操作的场景,例如数据库中的索引结构、编译器中的符号表等。在选择使用哪种树结构时,可以根据具体的应用需求和性能要求进行评估和选择。以上就是今天所有的内容啦~ 完结撒花~ 🥳🎉🎉

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

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

相关文章

渣土车与搅拌车安全问题解析及智能监控解决方案

一、背景分析 近年来&#xff0c;渣土车在货物运输中由于超载超速、违规驾驶、车辆盲区过大等问题导致的事故频发&#xff0c;严重影响了人们的生命财产安全。而搅拌车作为一种特殊的运输车辆&#xff0c;在混凝土输送过程中也存在类似的隐患。针对这些问题&#xff0c;对搅拌…

多维矩阵乘积运算和对应的广播机制

神经网络中的多维矩阵乘积运算&#xff1a; 遵循的原则是&#xff1a; 两张量前两维度应该是相同的&#xff0c;如果不同则其中一张量维度为1。 如果有论文中有遇到矩阵乘积的两项维度不一致&#xff0c;那就考虑它计算时是使用了广播机制&#xff08;如YOLACT&#xff09;。…

谁说只有车载HMI界面?现在工业类的HMI界面UI也崛起了

谁说只有车载HMI界面&#xff1f;现在工业类的HMI界面UI也崛起了 引言 艾斯视觉作为行业ui设计和前端开发领域的从业者&#xff0c;其观点始终认为&#xff1a;工业自动化和智能化水平不断提高&#xff0c;人机界面&#xff08;Human-Machine Interface&#xff0c;简称HMI&a…

Lombok的认识

Lombok的作用 Lombok是一个Java库&#xff0c;它可以通过简单的注解形式来帮助开发人员简化Java代码的编写&#xff0c;特别是减少模板代码的书写。具体来说&#xff0c;Lombok的主要作用包括&#xff1a; 减少模板代码&#xff1a;Lombok可以通过注解自动生成getter、setter、…

QT opencv常用代码备忘

最近在了解qt opencv的一些用法&#xff0c;把常用的代码记下来方便需要时复制使用 在默认.pro文件加入opencv包含路径和库文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecate…

网络钓鱼抓肉鸡实验

实验背景 网络钓鱼&#xff0c;攻击一台服务器或普通主机时&#xff0c;很可能会将这台服务器或主机变成“傀儡机”&#xff0c;帮助它攻击其它的主机&#xff0c;以达到窃取更多信息、组建僵尸网络、DDOS攻击等目的&#xff0c;危害性极大 其中僵尸网络&#xff08;Botnet&a…

运维锅总详解NFS

NFS是什么&#xff1f;如何对NFS进行部署及优化&#xff1f;NFS工作流程是什么&#xff1f;NFS的性能及优缺点是什么&#xff1f;NFS发展历史又是怎样的&#xff1f;希望本文能帮您解答这些疑惑&#xff01; 一、NFS简介 NFS (Network File System) 是由 Sun Microsystems 在…

rem实现屏幕适配(jQuery)

一、rem换算 1.根据视口宽度动态计算字体大小&#xff0c;如果宽度大于750px&#xff0c;则将字体大小设置为100px&#xff0c;否则按比例缩小。 tips:使用时记得引入jQuery.js // 在文档加载完成后执行函数&#xff0c;确保DOM已经准备就绪$(function () {// 定义一个自执行…

二叉树详解-第四篇 二叉树链式结构的实现

目录 1.二叉树的遍历 1.1前序遍历&#xff1a; 1.2 中序遍历&#xff1a; 1.3 后序遍历&#xff1a; 2.二叉树链式结构的实现 2.1 Tree.h 2.2 Tree.cpp 2.2.1 前序遍历 void PreOrder(TNode* Root) 2.2.2 中序遍历 void InOrder(TNode* Root) 2.2.3 后序遍历 void Bac…

【Python实战因果推断】58_因果推理概论8

目录 Identifying the Treatment Effect The Independence Assumption Identification with Randomization Identifying the Treatment Effect 现在你已经理解了问题所在&#xff0c;接下来该看看解决方案&#xff08;至少是一个解决方案&#xff09;了。识别&#xff08;i…

聊一聊知识图谱结合RAG

因为最近在做一些关于提高公司内部使用的聊天机器人的回答准确率&#xff0c;并且最近微软官方也是开源了一下graphrag的源码&#xff0c;所以想聊一聊这个知识图谱结合rag。 rag在利用私有数据增强大模型回答的领域是一种比较典型的技术&#xff0c;也就是我们提出问题的时候&…

网站漏洞扫描软件Burp suite和Xray安装应用及联合使用

目录 1、网站漏洞扫描软件应用-Burp suite 01 burp 扫描工具使用介绍&#xff1a; 02 burp 扫描工具安装过程&#xff1a; 1&#xff09;获取扫描工具程序包 2&#xff09;安装部署扫描工具 3&#xff09;bp安装完毕的基础设置&#xff1a; 3.1&#xff09;抓取浏览器访…

免费使用正版的Typora教程

1.来到Typora官网下载安装。 Typora官网: https://typoraio.cn/ 2.激活主程序 编辑修改Typora安装目录下文件 下面展示文件目录路径 &#xff1a; D:\SoftWare\Typora1.9.5\resources\page-dist\static\js\LicenseIndex.180dd4c7.4da8909c.chunk.js查找&#xff1a;e.hasAc…

huggingface里的模型如何下载呢?

HF-Mirror加速访问Hugging Face的门户。作为一个公益项目,我们致力于提供稳定、快速的镜像服务,帮助国内用户无障碍访问Hugging Face的资源。https://hf-mirror.com/ pip install -U huggingface_hub export HF_ENDPOINT=https://hf-mirror.com huggingface-cli download

别再浪费时间,快速实施项目管理软件的技巧

国内外主流的10款项目进度管理软件对比&#xff1a;PingCode、Worktile、蓝凌OA、用友、泛微OA、飞书、Asana、Trello、Smartsheet、Jira。 在快节奏的商业环境中&#xff0c;有效地管理项目进度常常是团队成功与否的关键。许多团队面临着项目管理过于复杂&#xff0c;难以迅速…

04 卷积神经网络

目录 1. 基本概念 1.1 卷积神经网络 1.2 卷积 1.3 汇聚&#xff08;池化&#xff09; 2. CNN网络架构及参数学习 2.1 网络架构 2.2 参数学习 3. 典型的卷积神经网络 3.1 LeNet-5 3.2 AlexNet 3.3 Inception网络 3.4 残差网络 4. 其他卷积方式 1. 基本概念 1.1 …

ElasticSearch搜索

ES搜索 elastic search 一套搜索引擎技术,主要技术栈包括 Elasticsearch&#xff1a;用于数据存储、计算和搜索 Kibana&#xff1a;用于数据可视化 在数据库模糊查询中,因为不走索引,所以效率很低,而在搜索引擎中,不仅效率高,而且即使出现个别错字,或者用拼音搜索,甚至用同…

LeetCode Hot100 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

本地化部署Chatglm和防踩坑攻略

最近想搞点什么东西练练手&#xff0c;传统crud又没有意义&#xff0c;于是就看到了给介绍AI的文章&#xff0c;然后就慢慢自己摸索&#xff0c;从0到1&#xff0c;独自部署应用。 项目简介 ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的对话预训练模型。ChatGLM3-6B 是…

CVPR`24 | 4D编辑哪家强?浙大首次提出通用指导4D编辑框架:Instruct 4D-to-4D

文章链接&#xff1a;https://arxiv.org/pdf/2406.09402 项目地址&#xff1a;https://immortalco.github.io/Instruct-4D-to-4D/ 今天和大家一起学习的是Instruct 4D-to-4D&#xff0c;可以通过2D扩散模型实现4D感知和时空一致性&#xff0c;以生成高质量的指令引导的动态场景…