STL之红黑树

STL 简单红黑树的实现 1.红黑树简介 二叉搜索树能够提供对数的元素插入和访问。二叉搜索树的规则是:任何节点的键值一定大于其左子树的每一个节点值,并小于右子树的每一个节点值。 常见的二叉搜索树有AVL-tree、RB-tree(红黑树)。红黑树具有极佳的增、删、查性能,故我们选择红黑树作为关联式容器(associative containers)的底层结构。 红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或 阅读详情

目录


一、二叉搜索树

1.1、什么是二叉搜索树

二叉搜索树或者是一棵空树;或者是具有下列性质的二叉树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值
  • 它的左、右子树分别为二叉搜索树

在这里插入图片描述

1.2、二叉搜索树的插入

新插入的节点一定是一个新添加的叶子节点,并且是查找不成功是查找路径上访问的最后一个节点的左孩子或右孩子节点。

若从空树出发,经过一系列的插入操作之后,可生成一棵二叉搜索树。

在这里插入图片描述

1.3、二叉搜索树的删除

从一棵二叉搜索树中删除一个节点 z 的整个策略分为三种基本情况:

  • 如果 z 没有孩子节点,那么只是简单地将它删除,并修改它的父节点,用空节点作为孩子来替换 z
  • 如果 z 只有一个孩子,那么将这个孩子提升到树中 z 的位置上,并修改 z 的父节点,用 z 的孩子替换 z
  • 如果 z 有两个孩子,则以其中序遍历时 z 的前驱或后继替换 z ,然后再将其前驱或后继删除,这样就转换为上述两种情况

1.4、二叉搜索树的查找分析

当二叉搜索树不空时,首先将给定值和根节点的关键字比较,若相等,则查找成功,否则将依据给定值和根节点的关键字之间的大小关系,分别在左子树或右子树上继续进行查找。

当插入的关键字有序时,构成的二叉搜索树变为单支树。树的深度为 n ,其平均查找长度为 (n + 1) / 2,这是最差的情况。最好的情况是二叉搜索树的形态和折半查找的判定树相同,其平均查找长度和 logn 成正比。在随机情况下,二叉搜索树的平均查找长度和 logn 是等数量级的。

1.5、平衡的二叉搜索树

当输入的数据不随机,或者经过插入或删除操作后,可能会导致二叉搜索树的左右子树深度相差太大,而这会造成搜索效率低下,因此需要保持二叉搜索树的平衡。

有多种特殊结构如 AVL-tree、RB-tree、AA-tree,均可实现平衡二叉搜索树。

二、AVL树

2.1、什么是AVL树

AVL树(Adelson-Velskii-Landis tree),它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是AVL树,且左子树和右子树的深度之差的绝对值不超过1。

在这里插入图片描述

2.2、生成AVL树

我们希望由任何初始序列构成的二叉搜索树都是AVL树。因为AVL树上任何节点的左右子树的深度之差都不超过1,它的深度和 logn 是同数量级的。由此,它的平均查找长度也和 logn 同数量级。

为了保持二叉搜索树的平衡,在插入节点时需要进行相应的操作。一般情况下,假设由于在二叉搜索树上插入节点而失去平衡的最小子树根节点的指针为 a(即 a 是离插入节点最近,且平衡因子绝对值超过1的祖先节点),则失去平衡后进行调整的规律可分为下列4种情况:

  • 单向右旋平衡处理:由于在 *a 的左子树根节点的左子树上插入节点,*a 的平衡因子由1增至2,致使以 *a 为根的子树失去平衡,则需进行一次向右的顺时针旋转操作

在这里插入图片描述

  • 单向左旋平衡处理:由于在 *a 的右子树根节点的右子树上插入节点,*a 的平衡因子由-1变为-2,致使以 *a 为根的子树失去平衡,则需进行一次向左的逆时针旋转操作

在这里插入图片描述

  • 双向旋转(先左后右)平衡处理:由于在 *a 的左子树根节点的右子树上插入节点,*a 的平衡因子由1变为2,致使以 *a 为根的子树失去平衡,则需进行两次旋转(先左旋后右旋)操作

在这里插入图片描述

  • 双向旋转(先右后左)平衡处理:由于在 *a 的右子树根节点的左子树上插入节点,*a 的平衡因子由-1变为-2,致使以 *a 为根的子树失去平衡,则需进行两次旋转(先右旋后左旋)操作

在这里插入图片描述

经过平衡旋转处理之后,以 *b 或 *c 为根的新子树为AVL树,且它的深度和插入之前以 *a 为根的子树相同。因此,当平衡的二叉搜索树因插入节点而失去平衡时,仅需对最小不平衡子树进行平衡旋转处理即可。因为经过旋转处理之后的子树深度和插入之前相同,因而不影响插入路径上所有祖先节点的平衡度。

三、红黑树

3.1、红黑树及其性质

红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是RED或BLACK。通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是近似于平衡的。

一棵红黑树是满足下面红黑性质的二叉搜索树:

  • 每个节点或者是红色的,或者是黑色的
  • 根节点是黑色的
  • 每个叶节点是黑色的
  • 如果一个节点是红色的,则它的两个子节点都是黑色的
  • 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

一棵有 n 个内部节点的红黑树的高度至少是 2lg(n + 1)。

从根到叶节点(不包括根节点)的任何一条简单路径上都至少有一半的节点为黑色,因为,根据第4条性质可知,一条简单路径上不可能有两个相邻的红色节点。

3.2、红黑树的插入操作

根据第5条性质可知,新插入的节点必须为红色。根据第4条性质可知,新插入节点的父节点必须为黑色。当新节点根据二叉搜索树的规则到达其插入点,却未能符合上述条件时,必须调整节点颜色并旋转树形。

设 z 表示待插入的节点,z 的父节点为 z.p,z.p 的兄弟节点为 y
插入情况共有6种,其中三种与另外三种是对称的。这取决于 z 的父节点 z.p 是 z 的祖父节点 z.p.p 的左孩子,还是右孩子:

3.2.1、z.p 是 z.p.p 的左孩子

  • 1、y 节点是红色的
    在这里插入图片描述

  • 2、y 节点是黑色的且 z 是一个右孩子

  • 3、y 节点是黑色的且 z 是一个左孩子

在这里插入图片描述
情况2先进行一次左转,变为情况3,然后再进行一次右转。(旋转方式与AVL树的“先左后右”旋转方式相同,详情请参考2.2、生成AVL树)

3.2.2、z.p 是 z.p.p 的右孩子

  • 1、y 节点是红色的
  • 2、y 节点是黑色的且 z 是一个左孩子
  • 3、y 节点是黑色的且 z 是一个右孩子

情况2先进行一次右转,变为情况3,然后再进行一次左转。(旋转方式与AVL树的“先右后左”旋转方式相同,详情请参考2.2、生成AVL树)

C++ STL源码剖析之红黑树 C++ STL源码剖析之红黑树导语红黑树节点基类红黑树节点红黑树迭代器红黑树操作红黑树插入旋转过程插入总结使用 导语 在STL源码中有两段话,简单翻译后如下: STL中Red-black tree(红黑树)class,用来当做SLT关系式容器(如set,multiset,map, multimap).里面所用的insertion和deletion方法以 《Introduction to Algorithms》一书为基础,但是有以下两点不同: (1)header不仅指向root,也指向红黑树的最左节点,以便用 阅读详情

相关推荐

利用Spm12进行fMRI数据分析:从预处理到结果解读的完整指南

本文提供了利用SPM12进行fMRI数据分析的完整流程指南,涵盖从数据预处理、统计建模到结果解读的全过程。详细介绍了在MATLAB环境下使用SPM12图形界面完成头动矫正、空间标准化等关键步骤的操作方法与避坑技巧,帮助神经科学研究者和心理学研究者高效处理功能磁共振成像数据并产出可靠结果。

weixin_29079671的博客 452

高阶数据结构 —— AVL树(平衡搜索树)

AVL树的实现,画图+代码,逻辑明明白白的。

lyzzs222的博客 1422

FMCW雷达基本原理(通俗易懂)篇2

FMCW雷达(Frequency Modulated Continuous Wave Radar)是一种使用频率调制连续波的雷达系统。它使用一个发射器发射一个连续波,但是这个连续波的频率会在一定的范围内不断变化。当这个连续波遇到一个目标物体并被反射回来时,接收器会检测到这个反射波的频率变化,并计算出目标物体的距离和速度等信息。FMCW雷达的原理可以理解为:1.发射器发射一个连续波,这个波的频率会从一个固定的起始频率开始,逐渐变化至一个固定的终止频率。

研二小学鸡的博客 7689

平衡搜索树-AVLTree

AVL树 又称为高度平衡的二叉搜索树。它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。 AVL树的性质 左子树和右子树的高度之差的绝对值不超过1 树中的每一个左子树和右子树都是AVL树 每个节点都有一个平衡因子,任一节点的平衡因子是-1或0或1.(每个节点的平衡因子等于右子树的高度减去左子树的高度,即:bf = rightHeigh - leftHeight)...

qq_37941471的博客 5586

sentaurus学习笔记(VDMOS仿真)(三)

在Sentaurus中,这通常意味着在2D仿真中,x轴指向下,y轴指向右。定义了在2D模拟中,网格尺寸按照一定的增长率进行扩展,这里的增长率为2.0,意味着远离最小尺寸区域的网格单元大小将是最小尺寸的两倍。定义了2D模拟中网格单元的最小尺寸为0.001微米,这有助于控制网格的最小大小,从而影响仿真的精度和计算成本。表示启用中等级别的日志信息输出,这有助于用户了解仿真过程中发生的事件和可能的问题。表示启用保存调试文件,这可以帮助用户在仿真过程中检查和验证模型的状态。这行代码设置了仿真过程中使用的线程数。

qq_52640792的博客 1807

FortiClient EMS实战:从安装到配置的全流程优化指南

本文详细解析了FortiClient EMS 7.0版本的部署与优化全流程,帮助企业构建零信任终端安全体系。从环境规划、高效安装、终端纳管到高级运维,提供实战指南和优化技巧,特别适用于Windows Server环境,助力企业提升终端安全管理效率。

weixin_29325007的博客 548

平衡查找树

总结自《算法》(第4版) 平衡查找树 2-3查找树 1. 查找 2. 插入 3. 2-3树构造实例 红黑树 1. 保存颜色信息 2. 旋转操作 3. 插入 4. 颜色变换 5. 旋转与颜色变换过程总结 6. 红黑树的性质 B树与B+树 B树简介 B树中检索关键码 B树中插入关键码 B+树简介 B+树中检索关键码 B+树中插入关键码 B+树中删除关键码 平衡查...

yhc166188的博客 495

手把手教你用ESP32驱动MAX30102心率血氧传感器(含完整代码)

本文详细介绍了如何使用ESP32微控制器驱动MAX30102心率血氧传感器,构建智能健康监测系统。内容涵盖PPG原理、硬件连接、驱动配置、信号处理算法以及Web服务器数据可视化,提供完整代码实现,帮助开发者快速上手物联网健康设备开发。

weixin_29208077的博客 587

平衡查找树(数据结构篇)

讲解数据结构之AVL树(平衡查找树)

hellmorning的博客 1593

7、Python高光谱分析工具(PyHAT)简介

Python高光谱分析工具(PyHAT)是一个开源、跨平台的Python库及图形用户界面,用于行星光谱数据的可视化与分析。它支持多种高光谱传感器数据,如火星勘测轨道飞行器的CRISM、月船1号的M3以及SELENE Kaguya SP点光谱仪,提供预处理、衍生产品生成、统计学习和机器学习分析功能。PyHAT基于Pandas和NumPy构建,兼容Jupyter和QGIS环境,旨在解决现有光谱分析方法缺乏开源实现、难以探索性分析和算法分散的问题。其模块化架构涵盖数据输入/输出、通用光谱变换、测绘与点观测工具及高

aa123的博客 138

Flowise智能调度系统设计与实现

本文深入探讨Flowise平台的智能调度系统设计与实现,包括调度模型、调度策略、调度优化、调度应用等方面。通过详细的设计方案和实现策略,帮助开发者构建智能的调度系统。本文详细介绍了Flowise平台的智能调度系统设计与实现,包括调度模型、调度策略、调度优化、调度应用等方面。通过详细的设计方案和实现策略,帮助开发者构建智能的调度系统。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1017

数据结构——平衡搜索树(AVL、红黑树、B树)

一、搜索数据结构 1. 概述 1)搜索/查找: ①遍历查找 O(n) ②二分查找 O(log(n)) ③哈希表 O(1) ④搜索树(平衡搜索树) 几种查找方式的比较: 哈希表实现线程安全还算容易,但树要实现线程安全不太容易 2. AVL树 1)节点结构: 必须是二叉树,必须是搜索树,任取树上节点且该节点的左右子树高度差不超过1(BF∈(-1,0,1))。是二叉搜索树的一种进化版本。 class AVLTreeNode{ Key key; Value value; AVLTreeNode left;

sduihoal的博客 810

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

再也不用担心STL的红黑树了。。。

C++ STL源码剖析之红黑树0.导语在STL源码中有两段话,简单翻译后如下:STL中Red-black tree(红黑树)class,用来当做SLT关系式容器(如set...

Francis的博客 837

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

STL红黑树

红黑树 红黑树根据红连接的位置可以分为偏左红黑树和偏右红黑树。这两种树分别对应了2-3树和2-3-4树,本篇文章只对偏左红黑树 偏左红黑树 概念 偏左红黑树是基于2-3树的思想的一种实现:红黑树是二叉树其中引入了红黑链接的概念,红链接对应2-3树中的3-结点,黑链接对应2-3树中的2-结点(普通节点) 性质 1.红链接均为左连接 2.没有任何一个结点同时与两条红链接相连(1条红链接连接的两个结点构成1个3-结点,两条就是4-结点) 3.红黑树是黑色平衡,任意空连接到根结点的路径上的黑链接数目相等 4.根结点

mxy568767179的博客 529

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【STL】STL中红黑树的应用set、multiset、map、multimap

上一篇博客介绍了红黑树的实现,下面介绍红黑树的应用,在STL中容器set和map,以及multiset和multimap底层实现都是红黑树。setset的底层就是用红黑树实现的,set的特性,所有元素都会根据元素的键值自动地排序。set元素的键值就是实值。set不允许两个元素有相同的键值。迭代器1、set不能通过迭代器修改set元素值。 因为set元素值就是键值关系到set元素排序规则,迭代器底层

菜鸟成长记 3045

STL中的红黑树

STL中的set、map都通过红黑树实现。红黑树的类型实际上是可以拿出来用的。用起来也是容易的。因为不是标准规定的容器,具体的名字可能会略有的差别。 例子最后演示了迭代器find()。这个地方语法上可以修改,但不能随便修改,因为会破坏key的排序。 #include <stdio.h> #include <set> using namespace std; typedef _Rb_tree<int, int, _Identity<int>, less<in

aaasssdddd96的博客 540

c++ STL 红黑树实现

红黑树是一种自平衡二叉查找树,它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。   红黑树应用: 1.linux内核中,进程的虚拟地址区间由红黑树组织管理 2.nginx中,超时时间由红黑树组织管理 3.C++ STL中,C++中set,multiset,map,multimap集合模板类都是在STL

永无止境 2331

如何使用 c++ stl 中的 map 以及红黑树 (一)

 Two Sum Given an array of integers, find two numbers such thatthey add up to a specific target number. The function twoSum should return indices of the twonumbers such that they add up

博客 8163

从零开始手写STL库:红黑树

红黑树的构建实际上是非常深入的一个工作,理论上讲应该按照:二叉搜索树-二叉平衡搜索树-红黑树 这样的顺序进行学习而且内容多,知识杂,在408考试里也属于是边缘且难度极大的内容了,一篇博客属实无法全部讲解清楚注意红黑树的五条性质即可。

weixin_48013375的博客 1763

【面经笔记】红黑树的特性与其在C++ STL中的应用

AVL树和红黑树适合内部存储应用,B树适合外部存储应用AVL树和红黑树都是用旋转保持平衡,AVL树对每个插入操作最多需要两次次旋转(单/双旋),对每个删除操作最多需要O(logn)次旋转;而红黑树对每个插入和删除操作,任何不平衡都会在三次旋转之内解决。查找、插入、删除的时间均为log(n),红黑树的算法时间复杂度和AVL相同,但红黑树的统计性能要好于平衡二叉树,但极端性能略差。平衡二叉树/AVL树:

xiaxzhou的博客 3349

STL源码分析之红黑树

主要分析一下STL里的红黑树,红黑树相对来说是一种较为复杂的数据结构,具体的学习方法建议看那种带有很多图解的博客,先理解其原理流程,再自己写下代码,其实就能理解了。STL里红黑树的实现有几个特点,一个它设置了一个空头结点header,它的左节点指向树最小元素,有节点指向树最大元素,实际带有有意义值的头结点为root,root的父节点为header.这使在一些插入删除操作时要讨论下特殊情况,附上代码...

sydney__的博客 276

STL map / set 底层机制: 红黑树完全剖析

前言: 在 STL 的容器中两大阵营 (vector deque list forward_list) 顺序容器 与 关联容器 (map set unorder_map unorder_set) 。 关联容器指的是以关键字匹配指定数据的一种关联数据结构的集合, 在关联容器中通过关键字去查找对应的数据是非常块的, 下面我们会彻底地去剖析其底层实现机制 : 红黑树。 由基础树 到 二叉搜索树 介绍红黑树之前,容许我介绍树的概念。 1. 树(tree), 在计算机科学中,是十分基础的数据结构: .

专注游戏研发 3365

STL RB Tree(红黑树)分析

红黑树的概念和条件,以及SGI STL中对RB Tree迭代器和数据结构以及一些重要函数的实现进行简要的说明。

UPing In The Road 2304

【C++】 使用红黑树模拟实现STL中的map与set

使用红黑树模拟实现STL中的map和set

m0_70980326的博客 1174
上一篇: STL之顺序容器
下一篇: STL之哈希表
Spring_24
博客等级 码龄12年 46粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spring_24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值