数据结构与算法(十二) 红黑树

红黑树

在阅读红黑树以前要弄明白B树,作到想到红黑树,心中有B树。没有弄明白的能够看我上一个文章

数据结构与算法(十一) 红黑树算法

红黑树例子

红黑树也是一种自平衡二叉搜索树数据结构

之前也叫作平衡二叉B树post

红黑树必须知足一下5个性质性能

  • 节点是有颜色的Red/Black
  • 根节点必须是Black
  • 叶子节点必须是Black
    • 红黑树的叶子节点会自动将度为0 或者度为1的节点的度自动补充为2,补充的节点称之为外部节点
      • 外部节点是空想出来的,代码中不会实现
  • red节点的子节点都是black
  • 从任意一节点到叶子节点的全部路径包含的black节点数目相同
    • 这里说的叶子节点包含假想出来的叶子节点

1、判断下面是否为红黑树

判断是否为红黑树

  • 不是3d

    知足code

    • 节点是有颜色的Red/Black
    • 根节点必须是Black
    • 叶子节点必须是Black
      • 红黑树的叶子节点会自动将度为0 或者度为1的节点的度自动补充为2,补充的节点称之为外部节点
        • 外部节点是空想出来的,代码中不会实现
    • red节点的子节点都是black
  • 不知足cdn

    • 从任意一节点到叶子节点的全部路径包含的black节点数目相同

解释不是红黑树

2、红黑树的等价变换

红黑树的等价变换

  • 红黑树和4阶B树具备等价性blog

    • Black节点与他的Red子节点融合在一块儿,就造成一个B树节点
  • 红黑树的Black节点个数与4阶B树的节点总数相等继承

3、红黑树的操做

一、添加

  • 想像成4阶B树
    • 添加操做都在叶子节点中。
    • 4阶B树全部节点的元素个数为 1 <= x <= 3
  • 建议新添加的节点默认为Red (这样能更快的知足红黑树的性质)。
  • 根节点默认为Black

全部的添加状况以下图所示递归

添加时全部的状况

添加状况处理:

a、当parent为black的状况,直接添加,无需特殊处理。(4种状况)
b、当parent为Red的状况。有如下几种状况(8种)
一、当uncle节点为Black
  • RR/LL状况

    • 先对parent染成黑色,在对grand染红(染色的意义是在与让后面旋转后parent的节点为黑色,parent的子节点为黑色)
    • 当RR/LL状况的时候,须要对其进行左旋转/右旋转。(grand变成parent的子节点)。
  • LR\RL状况

    • 将本身染成Black,grand染成Red 。(染色的意义是进行后面的双旋转操做后本身成为parent节点,规定partent的节点为黑色,parent的子节点(原来的parent和grand)为Red。)。
    • 进行双旋转
      • LR:parent左旋转,grand右旋转。
      • RL:parent右旋转,grand左旋转。
二、当uncle节点为Red

当uncle为Red的时候,红黑树对比4阶B树会发生上溢操做。

  • 将parent、uncle染成Black。(为了单独为一个节点作准备)。
  • 将grand向上合并
  • 将grand染成Red。当作是新节点进行处理。(递归,递归的代码只是染色,而旋转操做只作了1遍)
  • 状况以下图所示:

8中DoubleRed状况

二、删除

在B树中真正删除的元素都在叶子节点(若不是叶子节点,其前驱或者后继都为叶子节点,因此在替换后删除的仍然为叶子节点。 若是删除的是20,前驱15仍然是叶子节点)。

删除操做示例图

添加状况处理:

a、当删除的是Red节点的时候
  • 能够直接删除 无需其余操做
b、删除Black节点的时候
  • 当拥有2个Red子节点的black节点

    • 不可能直接删除、由于平衡二叉树要找到2个度节点的前驱或者后继、替换后删除的是前驱或者后继。(因此不用考虑这个状况)。
  • 当拥有1个Red子节点的black节点

    • 判断条件:用代替的子节点是Red
    • 将替代的的子节点染成Black
    • 状况以下图所示(删除60)

删除状况1

  • Black叶子节点

    • 若是Black叶子节点的兄弟节点为Black

      • 兄弟节点有红色节点
        • 叶子节点被删除后、可能致使B树下溢(删除33节点)
        • 进行旋转操做(LL/RR/RL/LR),旋转以后中心节点继承parent的颜色。 (下图10继承20颜色)
        • 旋转以后左右节点染色为Black (10的字节点)。
        • 删除操做下溢
      • 兄弟节点没有红色节点
        • 将兄弟节点染Red、parent节点染Black 既可。
          • 若是parent为Black, 会致使下溢,只须要把parent当作被删除的节点处理既可(递归)实验可得 递归次数小于三次。(下图中若是40的超级节点上只有40 没有20和70,那会发生下溢,只须要将40当作被删除的节点既可)。
          • 删除状况2
    • 若是Black叶子节点的兄弟节点为Red

      • 原理: 此时兄弟节点是20 。 咱们要将30变为45的兄弟节点。而后在进行兄弟节点为black操做

      • 将兄弟节点染成Black ,parent染成Red,再进行旋转。

      • 回到了兄弟节点为black的状况。

4、红黑树的平衡

红黑树是一种弱平衡。黑高度平衡,因为是黑高度平衡 和红黑树性质。因此最大路径小于最短路径的2倍

红黑树的最大高度是2 * log2^{n + 1},依然是O(logn)级别。

5、时间复杂度

搜索:O(logn)

添加:O(logn),O(1)次旋转操做

删除:O(logn),O(1)次旋转操做

6、AVL树VS红黑树

  • AVL

    • 平衡标准比较严格:每一个左右子树高度差1。

    • 最大高度是1.44 * log2^{(n + 2)} - 1.328(100W个节点,AVL最大高度28)。

    • 搜索、添加、删除都是O(logn)复杂度,其中添加须要O(1)次旋转调整、删除最多须要O(logn)次调整。

  • 红黑树

    • 平衡标准比较松:没有一条路径大于其余路径的二倍。

    • 最大高度是2 * log2^{(n + 1)}(100W个节点,红黑树最大高度40)。

    • 搜索、添加、删除都是O(logn)复杂度,其中添加删除都是O(1)次旋转调整。

  • 搜索的次数远大于插入和删除、选择AVL树;

  • 搜索、插入、删除的操做差很少,选择红黑树;

  • 相对于AVL,红黑树牺牲了部分平衡性能换取插入/删除时的少许旋转操做。总体性能优于AVL树

  • 红黑树的平均统计性能优于AVL树,实际应用更多选择红黑树。


喜欢的能够关注下个人公众号,会在第一时间更新

相关文章
相关标签/搜索