Red Black Tree Java

2025 年 5 月 3 日 | 阅读 8 分钟

红黑树 是一种特殊的 二叉搜索树,具有自平衡特性。红黑树的每个节点都有一个额外的位,始终被解释为颜色。为了在插入、更新和删除过程中保持红黑树的平衡,使用了红色和黑色。在红黑树中

  1. 每个节点都必须是红色或黑色。
  2. 根节点必须始终为黑色。
  3. 红色节点不能有红色父节点或红色子节点。
  4. 从任何节点到其任何后代 NULL 节点的路径具有相同数量的黑色节点。
Red Black Tree Java

红黑树中插入元素的算法

当我们向红黑树中插入一个节点时,它总是以颜色位 0(即红色)插入。如果插入节点后红黑树违反了其属性,我们将必须执行以下两个操作。

  1. 维护节点的颜色。
  2. 执行右-左或左-右旋转。

红黑树中插入节点的算法如下。

  1. 令 x 和 y 分别为红黑树的根和叶节点。
  2. 检查根节点是否为空。如果根节点不为空,则插入的节点将作为根节点插入,颜色位为 1,即黑色。
  3. 否则,我们将比较根节点元素与插入节点元素。如果它大于根节点元素,则遍历右子树,否则遍历左子树。
  4. 重复步骤 3,直到到达叶节点。
  5. 将叶节点的父节点设置为插入节点的父节点。
  6. 如果叶节点元素小于插入节点元素,则将插入节点作为左子节点。
  7. 否则,将插入节点作为右子节点。
  8. 对于插入节点的右子节点和左子节点,我们将它们都赋值为 NULL。
  9. 将位 0,即红色,设置为新插入的节点。
  10. 通过执行旋转和更改颜色位来维护红黑树的属性(如果被违反)。

插入后维护红黑树的算法

如果插入节点违反了红黑树的属性,我们需要使用以下算法进行维护

  1. 执行以下步骤,直到插入节点(z)的父节点 p 变为红色。
  2. 如果插入节点的父节点是 z 的祖父节点的左子节点,则执行以下步骤
    1. 情况 1
      1. 当 z 的祖父节点的右子节点的颜色为红色时,将祖父节点的两个子节点都设置为黑色,并将祖父节点设置为红色。
      2. 将祖父节点赋给新插入的节点
    2. 情况 2
      1. 否则,如果新插入的节点是父节点 p 的右子节点,则将 p 赋给新插入的节点。
      2. 对新插入的节点执行左旋。
    3. 情况 3
      1. 将父节点 p 设置为黑色,将祖父节点设置为红色。
      2. 对新插入的节点执行右旋。
  3. 否则,执行以下步骤。
    1. 如果 z 的祖父节点的左子节点的颜色为红色,则将祖父节点的两个子节点都设置为黑色,并将祖父节点设置为红色。
    2. 将祖父节点赋给新插入的节点。
    3. 否则,如果新插入的节点是父节点 p 的左子节点,则将父节点赋给新插入的节点,并对该新节点执行右旋。
    4. 将父节点 p 设置为黑色,将祖父节点设置为红色。
    5. 对祖父节点执行左旋。
  4. 将根节点设置为黑色。

RedBlackTreeExample.java

输出

Red Black Tree Java
Red Black Tree Java
Red Black Tree Java
Red Black Tree Java