文章目录

  • 红黑树的由来
  • 红黑树需要遵守的五大规则
  • 红黑树与4阶B树的相互转换!!
  • 红黑树的插入(12种情况)
  • 红黑树的删除(3大类情况)
  • 红黑树的平衡 以及与AVL树的性能比较

红黑树的由来

红黑树:红黑树是近似平衡的二叉搜索树。
比如二叉搜索树是为了优化线性表的搜索,把时间复杂度On优化为Olog2n和On之间(退化为链表)。
再比如AVL树为完全自平衡的二叉搜索树,优化了二叉搜索树,能够确保二叉搜索树不会退化为链表,做到时间复杂度更加贴近Olog2n,由于每一次出现不平衡都要旋转,加入了大量的旋转操作。

而红黑树是近似平衡的二叉搜索树,优化了AVL树大量的旋转操作,在综合性能上比AVL树更优秀

红黑树需要遵守的五大规则

无论是添加还是删除,只需要遵守这五大原则,红黑树就是平衡的,如果添加或删除打破了规则,那么就需要进行调整
第一点第二点第三点都是白给的,后面两点比较重要

红黑树与4阶B树的相互转换!!

红黑树的插入删除有多种情况,转化为B树结构后更好理解,红黑树所有操作完全等价于四阶B树
每一个黑结点与其两个红色的子结点组合起来,就是一个4阶B树的结点
从B树的角度去理解红黑树,推荐回看网课恋上数据结构与算法,个人认为从转换为B树后再理解插入删除的不同情况,确实比较好理解,所以建议回顾恋上数据结构的视频或PPT

红黑树的插入(12种情况)

插入删除原则:就是插入删除后依然符合红黑树五大原则,不然就调整
插入主要会打破性质四(默认插入结点为红色)

插入共有12种可能性

不用管种:其中4种不用管

旋转种:剩下8种中2种LL或RR,两种LR或RL,这四种可以通过旋转和重新染色,操作过程与AVL树的旋转类似(但是记得染色,B树结点中间那个元素是黑的)

上溢种:剩下4种,在插入前转化成B树那个结点已经有了红黑红三个结点了,此时插入结点会造成B树结点的上溢,此时操作和B树中上溢的操作一样,中间结点向上合并(可能造成连上溢),两边结点分裂成两个新的B树结点,合并操作看成新的对上面的插入操作(并把那个中间结点染成红色),然后再按照规则染色即可


注意下面的uncle指的是叔父结点,也就是父结点的兄弟结点
此外,看起来有些结点没有兄弟结点,也就没有uncle结点,但是不要忽视红黑树的null结点也算结点而且是黑色的






红黑树的删除(3大类情况)

  • 删除的是红色节点——不用调整,删完不影响红黑树的五条性质
    - 删除的是黑色结点:
  • 1.删除的黑色结点度为2(红黑树种其实只有度为2和叶子结点(null结点),但是这里为了方便,就省略了null结点的存在,即有两个红色子结点)
  • 联想二叉树中度为二的结点的删除,会找结点的前驱或后继结点删除,且最后删除的一定是叶子结点,因此红黑树中删除度为二的黑色结点,往往最后删除的是替代它的红色结点,因此也不用任何平衡
  • 2.删除的黑色结点度为1(有一个红色子结点)
  • 同二叉树度为1结点的删除,用子结点替代,但是需要重新染色
  • 3.删除的黑色结点度为0(没有红色子结点),比较复杂建议看ppt,关键在于转化为B树结构并联想上溢下溢的操作
  • 同四阶B树中只有一个元素的结点的删除,会造成下溢,同B树操作,转化成B树结构,看兄弟结点能不能借,能就旋转兄弟上去,父结点下来;不能就父结点中间那个下来合并,可以见B树笔记(2种)。
  • 另外一种是转化为B树结构中的父结点只有一个结点,这时会造成连续下溢。







红黑树的平衡 以及与AVL树的性能比较

AVL树的平衡:通过平衡因子,保证每个结点的两个子树高度相差1以内
红黑树的平衡:通过维护五条性质,使红黑树等价于四阶B树, 其平衡为近似平衡,不像AVL树那样完全平衡,也不会像普通二叉搜索树那样会退化成为链表,但整体性能优于AVL树。
平衡标准:没有一条路径会大于其他路径的两倍(最短全黑路径,最长一黑一红)
也可以理解为黑高度平衡,所有子树的黑结点高度是平衡的

AVL树和红黑树的最大区别:添加删除所需的旋转时间复杂度,添加都是
O(1),删除AVL树可能需要Ologn而红黑树依旧是O(1)
单论搜索其实还是AVL树占优,毕竟树高低,但是涉及添加删除就一般是红黑树占优了

2021-10-15 红黑树 概念和平衡操作理解以及与AVL对比分析 恋上数据结构笔记相关推荐

  1. 红黑树、B(+)树、跳表、AVL对比

    在网上学习了一些材料. 这一篇:https://www.zhihu.com/question/30527705 AVL树:最早的平衡二叉树之一.应用相对其他数据结构比较少.windows对进程地址空间 ...

  2. 红黑树概念及其相关操作的实现

    红黑树的概念 红黑树,是一种二叉搜索树,但它并不像AVL树一样,每个结点绑定一个平衡因子.但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black. 通过 对任何一条从根到叶子的路径上各个 ...

  3. Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》

    来自TIOBE的最新10月份统计数据显示,Python首次超越Java.JavaScript.C语言等,成为最受欢迎的编程语言.TIOBE过去20年一直在追踪编程语言的受欢迎程度,其数据来自于对25个 ...

  4. 红黑树:自平衡的二叉查找树

    前一篇博文中写道,二叉查找树是一种具有较高性能的符号表实现,在理想情况下它可以保证查找.插入和删除操作的时间复杂度在对数级别.二叉查找树可以动态地插入和删除元素,在插入和删除操作的过程中,二叉查找树的 ...

  5. 电动力学每日一题 2021/10/15 Fourier变换法计算均匀电流密度产生的磁场

    电动力学每日一题 2021/10/15 Fourier变换法计算均匀电流密度产生的磁场 无限长均匀电流 无限长圆柱面均匀电流密度 无限长均匀电流 假设z轴上有一根非常细的电线,携带均匀电流I0I_0I ...

  6. 为什么说红黑树是“近似平衡”的?

    我们前面也讲到,平衡二叉查找树的初衷,是为了解决二叉查找树因为动态更新导致的性能退化问题.所以,"平衡"的意思可以等价为性能不退化. "近似平衡"就等价为性能不 ...

  7. 面试旧敌之红黑树(直白介绍深入理解)

    2019独角兽企业重金招聘Python工程师标准>>> 读完本文你将了解到: 什么是红黑树 黑色高度 红黑树的 5 个特性 红黑树的左旋右旋 指定节点 x 的左旋 右图转成左图 指定 ...

  8. 《恋上数据结构第1季》红黑树(未完)

    红黑树(Red Black Tree) 红黑树介绍 红黑树 与 4阶B树 红黑树 与 2-3-4树 等价转换 红黑树基础代码 完整的红黑树系列代码(恐怖如斯) 二叉树 BinaryTree.java ...

  9. 红黑树详解(一)红黑树的介绍和操作

    红黑树详解(一)红黑树的介绍和操作 摘要: 在很多源码涉及到大量数据处理的时候,通常都是用红黑树这一数据结构.红黑树是一种自平衡的二叉查找树,它能在进行插入和删除操作时通过特定操作保持二叉查找树的平衡 ...

最新文章

  1. 13、Kubernetes核心技术Helm
  2. HDFS重复上传文件将会覆盖原文件
  3. iOS之深入解析谓词NSPredicate的语法与应用
  4. UVA - 817According to Bartjens
  5. 第02课:简单好用的中文分词利器 jieba 和 HanLP
  6. oracle的em能干什么,转载 解决Oracle的EM登录
  7. webview键盘自适应_黑爵毛茸茸机械键盘:感受来自治愈系的暖萌
  8. php pcre回溯攻击,PHP利用PCRE回溯次数限制绕过某些安全限制 | 码农网
  9. echarts 水桶注水式柱状图
  10. python3爬取网易云歌单数据清洗_如何利用Python网络爬虫爬取网易云音乐歌词
  11. mfc单文档中如何将view的基类由CView转为CScrollview
  12. 我笑了一天的签名。。。
  13. 自动make工具--CMake
  14. Tampermonkey油猴插件——使用教程整理
  15. 计算机网络初探教案,计算机网络基础知识教案.doc
  16. 非聚集索引中的临界点(Tipping Point)
  17. rabbitmq User can only log in via localhost
  18. 公考复盘(二)——第五季第六季
  19. Linux中删除文件夹和文件的命令(☆)
  20. MATLAB台大郭彦甫老师课程笔记:第十二课:统计

热门文章

  1. nRF52832的UICR
  2. U盘安装CentOS7跳坑记
  3. 十七、二叉树的建立与基本操作
  4. php跳转隐藏url参数,.htaccess从URL中删除index.php并隐藏参数键
  5. mysql 使用中 修复 blog_Java My-Blog之mysql容器重复初始化严重bug修复过程
  6. R语言:na.fail和na.omit
  7. optee内核中malloc函数的原理介绍
  8. android 判断时间是否过期_眉笔眉粉有保质期吗?怎么判断眉笔眉粉是否过期?...
  9. CreateService / SC 创建自启动服务
  10. (65)如何根据句柄从二级、三级结构句柄表中找到内核对象