美文网首页
2021-06-26红黑树

2021-06-26红黑树

作者: 竹blue | 来源:发表于2021-06-30 00:17 被阅读0次

概念

  1. 一种近似平衡的平衡二叉查找树,一类被标记为黑色,一类被标记为红色。【1.平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于 1。

    2.“近似平衡”就等价为性能不会退化得太严重。】

  2. 一种性能非常稳定的二叉查找树

概念辨析

  1. 根节点是黑色
  2. 每个叶子节点都是黑色的空节点(Null),也就是叶子节点不不存储数据
  3. 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的。
  4. 每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点

实现

  1. 按照固定的操作步骤,保存插入、删除的过程,不破坏平衡树的定义即可。
  2. 找准关注节点,不要搞丢、搞错关注节点
  3. 插入操作的平和调整比较简单,删除操作比较复杂。

操作

基本操作

左旋、右旋

左旋全称是:围绕某个节点的左旋,右旋全称是:围绕某个节点的右旋

操作

  • 红黑树的平衡调整过程是一个迭代的过程。我们把正在处理的节点叫做关注节点。关注节点会随着不停地迭代处理,而不断发生变化。最开始的关注节点就是新插入的节点
  • 红黑树的定义中“只包含红色节点和黑色节点”,经过初步调整之后,为了保证满足红黑树定义的最后一条要求,有些节点会被标记成两种颜色,“红 - 黑”或者“黑 - 黑”。如果一个节点被标记为了“黑 - 黑”,那在计算黑色节点个数的时候,要算成两个黑色节点。在下面的讲解中,如果一个节点既可以是红色,也可以是黑色,在画图的时候,我会用一半红色一半黑色来表示。如果一个节点是“红 - 黑”或者“黑 - 黑”,我会用左上角的一个小黑点来表示额外的黑色。

插入操作

  1. 原则:插入的节点必须是红色的,二叉查找树种新插入的节点都放在叶子节点上。
  2. 如果插入节点的父节点是黑色的,那么无任何操作即可,如果插入的节点是根节点,那么直接改变它的颜色
  3. 添加节点导致平衡被破坏的三种情况
    1. CASE 1:如果关注节点是 a,它的叔叔节点 d 是红色,我们就依次执行下面的操作:将关注节点 a 的父节点 b、叔叔节点 d 的颜色都设置成黑色;将关注节点 a 的祖父节点 c 的颜色设置成红色;关注节点变成 a 的祖父节点 c;跳到 CASE 2 或者 CASE 3。
    2. CASE 2:如果关注节点是 a,它的叔叔节点 d 是黑色,关注节点 a 是其父节点 b 的右子节点,我们就依次执行下面的操作:关注节点变成节点 a 的父节点 b;围绕新的关注节点b 左旋;跳到 CASE 3。
    3. CASE 3:如果关注节点是 a,它的叔叔节点 d 是黑色,关注节点 a 是其父节点 b 的左子节点,我们就依次执行下面的操作:围绕关注节点 a 的祖父节点 c 右旋;将关注节点 a 的父节点 b、兄弟节点 c 的颜色互换。调整结束。

删除操作

  1. 针对删除节点初步调整。(初步调整只是保证整棵红黑树在一个节点删除之后,仍然满足每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点;)
  2. 针对关注节点进行二次调整(让它满足红黑树的第三条定义,即不存在相邻的两个红色节点。
  3. 删除操作初步调整的3情况:
    1. CASE 1:如果要删除的节点是 a,它只有一个子节点 b,那我们就依次进行下面的操作:删除节点 a,并且把节点 b 替换到节点 a 的位置,这一部分操作跟普通的二叉查找树的删除操作一样;节点 a 只能是黑色,节点 b 也只能是红色,其他情况均不符合红黑树的定义。这种情况下,我们把节点 b 改为黑色;调整结束,不需要进行二次调整。
    2. CASE 2:如果要删除的节点 a 有两个非空子节点,并且它的后继节点就是节点 a 的右子节点 c。我们就依次进行下面的操作:如果节点 a 的后继节点就是右子节点 c,那右子节点 c 肯定没有左子树。我们把节点 a 删除,并且将节点 c 替换到节点 a 的位置。这一部分操作跟普通的二叉查找树的删除操作无异;然后把节点 c 的颜色设置为跟节点 a 相同的颜色;如果节点 c 是黑色,为了不违反红黑树的最后一条定义,我们给节点 c 的右子节点 d 多加一个黑色,这个时候节点 d 就成了“红 - 黑”或者“黑 - 黑”;这个时候,关注节点变成了节点 d,第二步的调整操作就会针对关注节点来做。
    3. CASE 3:如果要删除的是节点 a,它有两个非空子节点,并且节点 a 的后继节点不是右子节点,我们就依次进行下面的操作:找到后继节点 d,并将它删除,删除后继节点 d 的过程参照 CASE 1;将节点 a 替换成后继节点 d;把节点 d 的颜色设置为跟节点 a 相同的颜色;如果节点 d 是黑色,为了不违反红黑树的最后一条定义,我们给节点 d 的右子节点 c 多加一个黑色,这个时候节点 c 就成了“红 - 黑”或者“黑 - 黑”;这个时候,关注节点变成了节点 c,第二步的调整操作就会针对关注节点来做。
  4. 删除操作二次调整的4情况
    • CASE 1:如果关注节点是 a,它的兄弟节点 c 是红色的,我们就依次进行下面的操作:围绕关注节点 a 的父节点 b 左旋;关注节点 a 的父节点 b 和祖父节点 c 交换颜色;关注节点不变;继续从四种情况中选择适合的规则来调整。
    • CASE 2:如果关注节点是 a,它的兄弟节点 c 是黑色的,并且节点 c 的左右子节点 d、e 都是黑色的,我们就依次进行下面的操作:将关注节点 a 的兄弟节点 c 的颜色变成红色;从关注节点 a 中去掉一个黑色,这个时候节点 a 就是单纯的红色或者黑色;给关注节点 a 的父节点 b 添加一个黑色,这个时候节点 b 就变成了“红 - 黑”或者“黑 - 黑”;关注节点从 a 变成其父节点 b;继续从四种情况中选择符合的规则来调整。
    • CASE 3:如果关注节点是 a,它的兄弟节点 c 是黑色,c 的左子节点 d 是红色,c 的右子节点 e 是黑色,我们就依次进行下面的操作:围绕关注节点 a 的兄弟节点 c 右旋;节点 c 和节点 d 交换颜色;关注节点不变;跳转到 CASE 4,继续调整。
    • CASE 4:如果关注节点 a 的兄弟节点 c 是黑色的,并且 c 的右子节点是红色的,我们就依次进行下面的操作:围绕关注节点 a 的父节点 b 左旋;将关注节点 a 的兄弟节点 c 的颜色,跟关注节点 a 的父节点 b 设置成相同的颜色;将关注节点 a 的父节点 b 的颜色设置为黑色;从关注节点 a 中去掉一个黑色,节点 a 就变成了单纯的红色或者黑色;将关注节点 a 的叔叔节点 e 设置为黑色;调整结束。

应用

  1. 在工程中,但凡用到动态插入、删除、查找数据的场景,都可以用红黑树。
  2. 实现起来比较复杂,很多场景可以用跳表来替代

相关文章

  • 2021-06-26红黑树

    概念 一种近似平衡的平衡二叉查找树,一类被标记为黑色,一类被标记为红色。【1.平衡二叉树的严格定义是这样的:二叉树...

  • 数据结构—树—红黑树

    红黑树概述 红黑树的插入 红黑树的删除

  • TreeMap

    需要先了解红黑树,这是之前分析红黑树的文章。之前在分析红黑树时,我认为红黑树=二叉查找树+红黑平衡,关于二叉查找树...

  • 数据结构与算法-AVL 红黑树

    AVL树AVL树 算法红黑树红黑树 B站

  • [转载]红黑树

    https://zhuanlan.zhihu.com/p/24367771红黑树简介红黑树插入红黑树删除

  • 拿下红黑树

    红黑树 红黑树、2-3树的简单定义: 实现红黑树的基本结构以及添加操作(维护定义,左旋、右旋、颜色反转) 红黑树与...

  • 红黑树

    啥是红黑树,红黑树 = 二叉树

  • 彻底理解红黑树(二)之 插入

    彻底理解红黑树(一)之 二叉搜索树彻底理解红黑树(二)之 插入彻底理解红黑树(三)之 删除 前言 红黑树的插入情况...

  • 彻底理解红黑树(三)之 删除

    彻底理解红黑树(一)之 二叉搜索树彻底理解红黑树(二)之 插入彻底理解红黑树(三)之 删除 前言 红黑树的删除情况...

  • Golang红黑树

    红黑树 红黑树是每个节点都带有颜色属性(红色或黑色)的二叉查找树。红黑树也属于自平衡二叉查找树。 红黑树具有如下性...

网友评论

      本文标题:2021-06-26红黑树

      本文链接:https://www.haomeiwen.com/subject/iowzyltx.html