红黑树概述及插入删除逻辑

算法之红黑树:从插入到删除的深度解析与实践 在编程学习的漫漫长路上,算法犹如一座高峰,吸引着我们不断攀登。我在探索算法的过程中,遇到过不少难题,也积累了许多宝贵的经验。深知独自面对算法挑战时的艰辛,所以希望通过这篇博客,能与大家一同深入学习算法知识,在交流和分享中共同进步,让更多人领略算法的魅力,提升编程能力。 阅读详情

红黑树概述(插入删除逻辑及其实现)

  • 搜索树进化历程
  1. 二叉搜索树(二叉树,左小右大) 中序遍历 有序排列

  2. 二叉平衡搜索树(二叉树,平衡因子,左小右大) 中序遍历 有序排列 树的高度可控

    1. 优点:静态特性最优,二叉平衡搜索树一旦构造完成,查找时效率最高
    2. 缺点:动态特性差,插入删除节点频率较高会导致旋转次数增加导致效率降低
  3. 红黑树:在上述基础上加入了颜色约束,具体表示为5个性质,树的高度仍然可控,但是在插入删除时的平衡因子要求没有那么苛刻,旋转频率下降

    工程中常用

  • 红黑树的应用
  1. C++ STL中的map、set
  2. 哈希表的unorder_map、unorder_set
  • 红黑树的性质
  1. 每个节点非黑即红
  2. 根节点必须是黑色
  3. 每个叶子节点必须是黑色(此处叶子节点指的是:度为0的节点指向的NULL)
  4. 如果一个节点是红色的,则它的子节点必须是黑色的(不能有连着的两个红色节点)
  5. 任何一个节点的黑高相同(该节点到NULL的所有路径上的黑色节点数量相同)
    在这里插入图片描述

  • 红黑树是如何保持平衡的

通过旋转(二叉平衡树的旋转操作)和着色(5个颜色性质)的操作来降低旋转的频率来保持平衡

  • 红黑树的插入逻辑
  1. 将插入节点着色为红色

    根据红黑树的五个性质,将插入节点着色为红色,不会违背 特性5 ,少违背一条特性,就少一些要处理的情况,接下来就努力满足其他性质即可

  2. 如果插入节点是根节点,则将插入节点着色为黑色

  3. 插入后出现红红节点情况的处理

    叔叔节点:父节点的兄弟节点

    调整的核心是叔叔节点的颜色

    ⭐tips:三角形代表下方子树,而不是NULL

    • 叔叔节点是红色
      在这里插入图片描述

      解决流程

      1. 将父节点p设为黑色
      2. 将叔叔节点u设为黑色
      3. 将祖父节点g设为红色。
      4. 将祖父节点设为当前节点。

      将矛盾转移成叔叔节点是黑色

    • 叔叔节点是黑色

      • LL:右旋g

        在这里插入图片描述

        1. 将父节点设为黑色
        2. 将祖父节点设为红色
        3. 以祖父节点为支点进行右旋
      • LR:左旋p
        在这里插入图片描述
        又回到了LL状态,解决方式相同

      • RR,RL同理只不过反了个方向

  4. 红黑树的删除逻辑

    待删除节点y,替换节点x

    1. y是红色,x是黑色,直接用x替换y即可(颜色数值都替换)

    2. y是黑色,x是红色,那就用x的值把y的值覆盖掉即可(颜色不用改变)

    3. y和x均为红色不可能出现(红黑树中不能出现两个连续的红红节点)

    4. y和x均为黑色则涉及到双黑节点(因为原红黑树中的黑高都是一样的,删除掉黑色节点以后会导致黑高发生变化,故而引进双黑节点保证黑高相同):具体情况如下

      一个重要逻辑,保证有同向红节点(用来接收颜色转换的黑色节点)

      双黑节点情况:

      1. 当节点x是双黑节点且不是根节点

        1. x的兄弟节点w是黑色且w的孩子节点至少有一个是红色的

          对于这种情况,需要对x的兄弟节点w进行旋转操作,将w的一个红色节点用r表示,x和w的父节点用p表示,那么p,w和r将可能出现四种可能性(LL、LR、RR、RL)

          1. LL情况(w是p的左孩子,r是w的左孩子,或者w的两个孩子都是红色)
            在这里插入图片描述

          tips:此时在p w r这条路中,r对于p w来说就是同向红节点,而18节点对于p w来说则时异向红节点。

          如图所示,要删除掉25节点时,x与y都是黑色节点,为保持这一棵子树中黑高一致,将a节点变为双黑节点并进行如下操作:

          ​ r的颜色变为w的颜色,w的颜色变为p的颜色,此时p变为黑高为0的空白节点。要将双黑节点中的一个黑色给p;但是直接给的话会导致以p为根节点的树两边黑高不等,并且也会影响p上方树的黑高。因此需要旋转操作。图中的情况是LL则以p为根节点进行右旋,然后再将双黑节点a的一个黑色给空白节点p,由此完成了LL的删除操作。旋转与BST的旋转操作一致。

          1. LR情况(w是p的左孩子,r是w的右孩子)

          在这里插入图片描述

          ​ 其他与LL都相同,只不过要先以w为轴旋转得到同向红节点,在进行与LL相同的操作即可。
          在这里插入图片描述

          接下来的RR、RL与上述情况类似,只不过反了个方向。

        2. x的兄弟节点是黑色且它的两个孩子都是黑色的

          对于这种情况需要递归地进行处理,如果删除节点后得到的双黑节点的父节点此时为黑色,则节点u变单黑,且节点u的父节点p变双黑,然后对节点u的父节点p继续进行处理,直到当前处理的双黑节点的父节点为红色节点,此时将双黑节点的父节点设置为黑色,双黑节点变为单黑节点。

          (红色 + 双黑 = 单黑)

          通俗理解:也是转移矛盾的思路,因为在当前范围内没有红节点可以用来存放黑高,那就把根节点变为双黑节点,把原来双黑节点的兄弟节点变为红色,递归到上一层解决问题,就又回到了上一种情况。
          在这里插入图片描述

        3. x的兄弟节点w是红色节点
          在这里插入图片描述在这里插入图片描述

        4. 当前节点x是双黑节点且是根节点

          与上述情况一致,向上递归继续找红节点即可

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

相关推荐

win10 运行lisflood_8踩过的坑

1、安装cuda及VS2019 https://www.bilibili.com/read/cv7335974/ 2、netcdf.h头文件找不到问题 https://www.cnblogs.com/lyggqm/p/12926974.html https://blog.youkuaiyun.com/u011954296/article/details/54617048 3、编码问题 https://blog.youkuaiyun.com/qq_33485434/article/details/81196843 4、

我的笔记 4115

C++笔记---红黑树的插入删除

红黑树是一棵二叉搜索树,他的每个结点增加一个存储位来表示结点的颜色,可以是红色或者黑色。通过对任何一条从根到叶子的路径上各个结点的颜色进行约束,红黑树确保对于任意一个结点,没有一条到NULL结点的路径会比其他到NULL结点的路径长度的两倍以上,因而是接近平衡的。

2302_80372340的博客 1817

ClickHouse分布式表原理:大数据分片存储与查询

我是一名资深大数据工程师,专注于ClickHouse优化和分布式架构设计。拥有5年以上大数据开发经验,曾为多家电商、金融公司提供ClickHouse解决方案。欢迎关注我的博客(),一起探讨大数据技术!留言互动:你在使用ClickHouse分布式表时遇到过什么问题?欢迎在评论区分享,我会一一解答!

AI大模型应用之禅 959

红黑树及其插入、删除操作

在二叉搜索树中,基本操作如结点的插入、删除、查找的性能上界都得不到保证,原因在于二叉搜索树的构造依赖于其结点值的插入顺序,最坏情况下二叉搜索树会退化为单链表(如下图所示)。因此我们需要对二叉搜索树做出一些改进和限制,从而使其拥有更好更稳定的性能上界保证。红黑树就是一种自平衡的二叉搜索树。 定义 红黑树除了满足二叉搜索树的性质以外,还有以下性质: (1)红黑树的结点都是带有“颜色”属性的,...

程序人生 2287

CentOS7下快速修复libssl.so.1.1缺失问题(附腾讯云镜像加速下载)

本文详细介绍了在CentOS7系统中快速修复libssl.so.1.1缺失问题的工程化实践方案。通过编译安装OpenSSL 1.1.x版本、配置动态链接器及创建符号链接等步骤,有效解决共享对象文件缺失问题,并提供了腾讯云镜像加速下载的优化方案,帮助开发者高效部署现代应用。

weixin_33711647的博客 367

基于小波变换的信号降噪处理及仿真研究_信号处理方法推荐--1(转载自用,侵删)...

综述作者:aresmiki链接:https://www.zhihu.com/question/23701194/answer/167005497来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。非平稳信号处理应该是现在信号处理技术最新的也是最热的研究方向了,信号处理方法从最早的时域统计到傅里叶变换的频域分析,是人们认识信号本质的一次巨大飞跃,给了分析人员换个角度看世界的...

weixin_32144483的博客 1249

【STL】红黑树(插入、删除底层实现)

首先我们来聊一聊红黑树是什么在之前的学习中,我们了解到了二叉搜索树,AVL树二叉搜索树的特性是左子树 < 根 < 右子树,但是二叉搜索树也有缺点,就是如果处在极端情况下,那么二叉搜索树的效率就和链表差不多为了解决这个问题,我们学习了AVL树,这棵树是通过旋转来控制树的高度,以此来达到绝对平衡的目的,也就是任何一棵子树,左右高度差都不会超过1但是这也伴随着一个问题就是,如果我们每一次插入,都判断、旋转,这样子的效率固然是高,但是有没有更好的办法,让其在保持高度平衡的同时,尽量减少旋转的次数。

2302_80023639的博客 1416

瑞萨CS+仿真器高级配置指南:从原理到实战优化RX系列MCU调试

在嵌入式系统开发中,仿真器是进行早期验证和深度调试的核心工具。它通过精确模拟目标微控制器的指令集、内存和外设行为,构建了一个虚拟的硬件沙盒环境。其工作原理在于对CPU核心、时钟系统和外设接口的软件模拟,使开发者能在无物理硬件时进行代码逻辑验证、内存布局规划和时序分析。这项技术的核心价值在于大幅降低开发成本、加速问题定位,并支持复杂场景的复现与测试。在瑞萨RX系列MCU开发中,CS+集成开发环境内置的仿真器功能尤为强大。本文聚焦于**指令解码缓存**和**外设时钟比率**等关键配置的深度解析,阐述如何通过优化

cmff98425的博客 1121

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 218

Allegro如何导出和导入器件模型Signal_Model操作指导

在用Allegro做PCB设计的时候,通常需要给器件加上Signal_Model,在做等长的时候用到的非常频繁。如下图,需要把R7002的Signal_Model导入到另外一块没有给R7002加好模型的BRD中。Allegro除了可以给器件添加模型,还支持从一块加好模型的BRD导入到另外一块BRD中,如何导出和导入器件模型Signal_Model操作指导。

weixin_54787054的博客 1896

YOLOv12改进策略【损失函数篇】| 替换Powerful-IoU(PIoU),增强对中等质量锚框的关注力,引导锚框更直接、高效地回归

本文针对现有基于IoU的损失函数在目标检测任务中存在的问题,提出了利用Powerful-IoU(PIoU)及其升级版PIoU v2改进YOLOv12的损失函数,以提高模型精度。文章详细介绍了PIoU和PIoU v2的结构原理,并提供了在YOLOv12中实现这些损失函数的具体步骤和代码修改方法。

Limiiiing的博客 931

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 314

淘宝滑块验证码破解:Python模拟鼠标轨迹过关详解

本文全面解析了淘宝滑块验证码的破解流程,从机制分析、图像处理、轨迹模拟到自动化实现,提供了完整的Python解决方案。随着2026年风控技术的升级,单纯依靠轨迹模拟已经难以达到高通过率,未来趋势是结合强化学习生成更自然的轨迹,并利用深度神经网络进行端到端的验证码绕过。此外,各大平台正逐步推广"无感验证"和"行为式验证码",将验证融入到用户正常操作中,这对爬虫技术提出了更高的挑战。技术本身是中立的,关键在于使用者的目的。希望本文能帮助开发者更好地理解验证码对抗技术,从而设计出更安全的防御系统。

2201_76125261的博客 96

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 590

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 20

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 750

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 370

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 171

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 409

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 85

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 218

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 178

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 352

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 399

考拉兹猜想 - 7

本文通过引入虚数单位重构Collatz猜想的迭代逻辑,指出偶数减半与奇数“乘3加1”的过程在虚数坐标下等价于归结操作。关键在于:乘3加1使奇数跃升至偶数,随后持续减半,而虚数单位代表“无限减1”,实现无限向有限的转化。无论初始值如何,减半始终主导,最终归结为4-2-1循环。该视角消解了正向思维中的速度竞争疑虑,证明归结是必然结果。

杨铸人的博客 42

从曲线到储层:Techlog/KAPPA 全流程算法、UltraLAB 选型与本地 AI 部署实战

以高频 CPU 保证交互,以充足内存承载多井与多任务,以 NVMe 打通项目和知识库 I/O,再按本地模型、上下文与并发配置 GPU。对 UltraLAB 用户而言,更合理的采购方式是带着真实项目做选型:一组典型井、一套完整解释模板、一个目标大模型、一次多人并发测试。用实测结果确定配置,才能把预算转化为解释效率,而不是闲置算力。软件模块、操作系统与许可条件以厂商当前正式说明为准;硬件建议需结合项目实测。AI 输出只能作为辅助证据,不能替代岩石物理与油藏工程专业审核。

wdf8088的博客 181
上一篇: 二叉平衡树的插入与删除
下一篇: B树与B+树概述
吃烤鱼Rocky
博客等级 码龄2年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值