本文整理红黑树学习过程中的知识点和底层代码实现。

目录

  • 基本概念
    • 1、介绍
    • 2、应用
    • 3、性质
  • 实现红黑树
    • 1、原理
    • 2、操作
      • 1)查找
      • 2)插入
      • 3)删除
  • 和其他相似结构的对比
    • 1、二叉搜索树(BST)
    • 2、AVL树
      • 1)例子
      • 2)插入
      • 3)删除
      • 4)搜索
      • 5)结论

基本概念

1、介绍

红黑树 又叫对称二叉B树,是一种自平衡的二叉搜索树,因其插入、搜索、删除节点的效率都比较高而被广泛引用。

2、应用

  1. Linux下IO多路复用epoll 的实现采用红黑树组织管理 sockfd,以支持快速的增删改查,时间复杂度为O(log(n));
  2. ngnix中,用红黑树管理timer,因为红黑树是有序的,可以很快的得到距离当前最小的定时器.

3、性质

利用二叉搜索树可以简化对树中某个节点的查找,使平均情况下的时间复杂度从O(n)降到O(log(n)),但是普通的二叉搜索树在极端情况下可退化成链表,如下图:


此时的增删查效率都很低,为了应对这个问题,出现了许多加入自平衡机制的搜索树(详细可见本文最后一节),红黑树就是其中一种。

红黑树按照如下性质实现自平衡:

  1. 节点是红色或者黑色
  2. (root)必是黑色;
  3. 叶子节点都为NULL且为黑色
  4. 每个红色节点必须有两个黑色的子节点,所以保证了每个叶子节点到根节点之间的路径上不能有两个连续的红色节点
  5. 任意节点其每个叶子节点所有路径上都包含相同数量的黑色节点
  6. 新增加的节点为红色,因为这样效率高。

例子如下:

实现红黑树

1、原理

由上述红黑树的性质可推出如下性质:

从根节点到叶子节点的最长路径不大于最短路径两倍

最短路径:由规则5可得 只有黑色节点的路径是最短路径(整条路径上没有红色节点)
最长路径:同理,黑红相间的路径必是最长路径,此时黑色节点数量是红色节点数量+1。

通过以上性质构建出来的树即为红黑树,这些性质在进行增删查操作的过程中都会被使用到。

2、操作

在讨论红黑树增删查操作之前,先确定一些基本概念
1、树上节点关系,图片来源 b站谢某人er红黑树解说

2、插入元素节点颜色为红色,是为了更轻易修复红黑树的性质。
3、前驱:左子树中值最大的节点,后继:右子树中值最小的节点。
4、前驱和后继都是数值上最接近该节点的节点,在一些情况下需要用它们来替代删除节点(如果同时有前驱和后继,任意一个来替代删除节点都可以)。

1)查找

此过程与二叉搜索树完全一致,不再赘述,时间复杂度为O(log(n))

2)插入


(图片来自黑马程序员视频教程)

3)删除

删除节点的工作主要分为两部分:

  1. 先根据二叉搜索树的性质,找到要删除的节点;
  2. 删除该节点后,修复树的红黑性质。

与删除二叉搜索树节点相同,删除红黑树节点时也只需要考虑子节点个数,但额外需要考虑被删节点的颜色。

情况1:被删节点无子节点,且被删节点为红色

直接删除即可,不会破坏红黑性质。


情况2:被删节点无子节点,且被删节点为黑色

此时删除该节点必然会破坏性质5,所以删除后通过兄弟节点及其子树(一定存在)的情况来修复红黑性质。过程比较复杂,此处不展开。详细可参考 CSDN nguliu 的博文。

情况3:被删节点有一个子节点,且被删节点为黑色

此时被删节点的子节点必为红色,此时将该节点删去,用其子节点替换被删节点即可,之后将子节点变黑即可。

情况4:被删节点有两个子节点,且被删节点为黑色或红色

先确定被删节点的前驱或者后继,然后用前驱或后继替换被删节点,删除操作完成后,会转为其他情况,然后按上述情况解决即可。

和其他相似结构的对比

1、二叉搜索树(BST)

红黑树的存在就是为了解决二叉搜索树在极端情况下会退化成链表的的问题。

在增删查的操作上。红黑树与BST相似,只是要增加一些颜色的变换以及因为颜色变换而变多的恢复情况。

2、AVL树

1)例子

对应的相同数据的红黑树(可视化省略了叶子节点):

2)插入

AVL利用平衡因子来使得左右子树的高度差不大于1,所以当插入元素引起树不平衡时只需要考虑旋转来平衡左右子树,并且最多只需要两次旋转就可完成,时间复杂度O(1)

而红黑树同样也需要最多两次旋转,但还需要考虑颜色变换时间复杂度也是O(1)

3)删除

AVL通常需要往上回溯多个节点的节点,时间复杂度为O(log(n))。

红黑树最多只需要三次旋转,时间复杂度O(1)。

4)搜索

通过上述例子可以发现,AVL的搜索稳定性要大于红黑树(左右子树高度差一定小于等于1),而红黑树左右子树的高度差范围更大(可以等于2,此时左右子树可以相差一个黑节点和一个红节点)。

5)结论

若业务需要大量的插入和删除(例如epoll中的sockfd),红黑树效率更高,如果删除操作较少,AVL效率更高。

【高级数据结构】红黑树相关推荐

  1. 高级数据结构——红黑树

    目录 红黑树 红黑树定义 红黑树节点实现 红黑树插入实现 红黑树删除实现 红黑树 红黑树定义 在之前介绍AVL树时,我们知道AVL树是高度平衡的二叉搜索树,而高度平衡意味着在对AVL树中的节点作更新操 ...

  2. 数据结构 - 红黑树

    数据结构 - 红黑树 - 面试常问知识点 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图. 本文主 ...

  3. 数据结构-红黑树插入结点示例

    数据结构-红黑树插入结点示例 1.红黑树简介 2.在线可视化生成红黑树工具 3.红黑树插入结点性质和规则 3.1.红黑树插入结点性质 3.2.红黑树插入结点规则 4.红黑树插入结点示例 4.1.红黑树 ...

  4. 数据结构 红黑树(RBTree)的原理与实现

    学习红黑树之前你应该保证你学过AVL树,也就是平衡二叉搜索树 数据结构 AVL树 AVL树是一棵高度平衡的二叉搜索树,其要求每个结点的高度差不能大于1,这样子就保证了其查询的时间复杂度为log2(N) ...

  5. java数据结构红黑树上旋下旋_存储系统的基本数据结构之一: 跳表 (SkipList)

    在接下来的系列文章中,我们将介绍一系列应用于存储以及IO子系统的数据结构.这些数据结构相互关联又有着巨大的区别,希望我们能够不辱使命的将他们分门别类的介绍清楚.本文为第一节,介绍一个简单而又有用的数据 ...

  6. 数据结构-红黑树原理分析

    前言 在阅读HashMap源码的时候发现,java1.8的HashMap的链表实现增加了红黑树,当链表长度超过指定阈值8的时候回进行树化. 为了提高增删查的效率. 而红黑树又比较复杂,所以专门写一篇关 ...

  7. 数据结构-----红黑树的插入操作

    红黑树是一棵二叉搜索树:树种每一个节点的颜色不是黑色就是红色.本篇中只实现用节点的颜色来描述红黑树,性质如下: RB1:根节点和所有外部节点都是黑色: RB2:在根至外部节点路径上,没有连续两个节点是 ...

  8. 数据结构--红黑树 Red Black Tree

    文章目录 1.概念 2.操作 2.1 左旋.右旋(围绕某个节点的左/右旋) 2.2 插入 2.3 删除 3. 代码 1.概念 二叉树在频繁动态增删后,可能退化成链表,时间复杂度由 O(lgn) 变成 ...

  9. 数据结构---红黑树的原理

    产生原因 有了AVL树为啥需要红黑树呢,我们知道AVL树可以保证查询的时间复杂度为O(long 2^N),但是我们知道AVL树的插入操作,结点之间调整非常复杂,导致AVL树的性能非常低下. 红黑树,是 ...

  10. 数据结构——红黑树(red-black tree)

    RB-tree(红黑树)是一种平衡二叉搜索树,它每个节点上增加了一个存储位来表示节点的颜色,可以是 Red 或 Black,故得名.通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,红黑树能 ...

最新文章

  1. [转载]Surging 分布式微服务框架使用入门
  2. springmvc+log4j操作日志记录,详细配置
  3. 什么是JAX-RS注释? (第3部分)
  4. 磁盘Raid方案简单对比
  5. torch.nn.Embedding()的固定化
  6. algorithm头文件下的next_permutation()
  7. 深度学习在推断阶段(inference)的硬件实现方法概述
  8. 使用wget抓取网站资源
  9. 软考必备资料大放送,全科目软考资料都给你备好了!
  10. FbinstTool万能启动超级简单教程
  11. IT人的职业生涯规划
  12. 寻找春天nbsp;九宫格日记-2011.04.17
  13. 打印机地址0xfcdaa06d造成了一个保护错误。(例外码0xe06d7363)
  14. 新媒体运营:如何策划出一场完整高效的活动方案?(一) | 黎想
  15. paip 刮刮卡砸金蛋抽奖概率算法跟核心流程
  16. 理海大学计算机专业好申吗,美国留学选工科就来了解一下理海大学~
  17. cpp课程设计实验题:定义一个描述学生(Student)基本情况的类,数据成员包括姓名(name)、学号(num)、数学成绩(mathScore)、英语成绩(englishScore)、人数(coun
  18. ERP开发使用Flex
  19. C语言用递归调用实现阶乘
  20. WebApp简单制作

热门文章

  1. 电子计算机管理,电子计算机档案管理
  2. 疫情之下,零售企业不该只是为了 “ 活 ” !
  3. HTML和CSS整合笔记
  4. python多子图导出至pdf_matplotlib保存为pdf,并将子图作为嵌入的矢量图像
  5. 单片机复习总结和题目
  6. dt /dt dd /dd dl/dl
  7. 思科ASR防火墙实操手册
  8. 一份贷后实务内容:催收策略与失联模型定义
  9. libreoffice 开发文档_工具库-基于LibreOffice实现文档操作
  10. oracle wip表,oracle ebs wip表关系(Oracle, EBS, WIP table relations).doc