📜  红黑树|套装2(插入)

📅  最后修改于: 2021-04-17 13:16:07             🧑  作者: Mango

在上一篇文章中,我们讨论了红黑树的介绍。在这篇文章中,讨论了插入。在AVL树插入中,我们使用旋转作为工具来在插入后进行平衡。在红黑树中,我们使用两种工具进行平衡。

  1. 重新着色
  2. 回转

重新着色是节点颜色的变化,即如果颜色为红色,则将其更改为黑色,反之亦然。必须注意的是,NULL节点的颜色始终为黑色。而且,我们总是先尝试重新着色,如果重新着色不起作用,则我们进行旋转。以下是详细的算法。该算法主要有两种情况,具体取决于叔叔的肤色。如果叔叔是红色的,我们会重新着色。如果叔叔是黑人,我们会进行轮换和/或重新上色。

我们将使用的表示形式是:

该表示基于X

逻辑:

首先,您必须像在二叉树中那样插入节点,并为其分配红色。现在,如果该节点是根节点,则将其颜色更改为黑色,但如果不是,则将其检查父节点的颜色。如果它的颜色是黑色,则不要更改颜色,但是如果颜色不是红色,则请检查节点的叔叔的颜色。如果节点的叔叔是红色,则将节点的父母和叔叔的颜色更改为黑色,将祖父的颜色更改为红色,并为他(即祖父)重复相同的过程。

但是,如果节点的叔叔为黑色,则可能有4种情况:

  • 左左外壳(LL旋转):

  • 左右案例(LR旋转):

  • 右右案例(RR旋转):

  • 左右案例(RL旋转):

现在,在这些旋转之后,如果节点的颜色未匹配,则需要重新着色。

算法:

令x为新插入的节点。

  1. 执行标准的BST插入,并使新插入的节点的颜色为红色。
  2. 如果x为根,请将x的颜色更改为BLACK(完整树的黑色高度增加1)。
  3. 如果x的父级的颜色不是黑色并且x不是根,请执行以下操作。
    a)如果x的叔叔是红色的(祖父母的财产4一定是黑色的)
    (i)将父母和叔叔的颜色更改为黑色。
    (ii)祖父母的颜色为红色。
    (iii)更改x = x的祖父母,对新x重复步骤2和3。

    b)如果x的叔叔是BLACK ,则x可以有四种配置,即x的父母( p )和x的祖父母( g )(这类似于AVL树)
    (i) Left Left Case(p是g的左孩子,x是p的左孩子)
    (ii)左右案例(p是g的左子代,x是p的右子代)
    (iii)对对案(对案i的反映)
    (iv)左右案例(案例ii的镜像)

示例:在一个空树中创建一个包含元素3、21、32和17的红黑树。

解决方案:

当插入第一个元素时,它将作为根节点插入,并且由于根节点具有黑色,因此获得黑色。

新元素始终以红色插入,并且21> 3,因此它成为根节点右子树的一部分。

现在,当我们插入32时,我们看到有一个红色父子对违反了Red-Black树规则,因此我们必须旋转它。此外,我们看到了RR旋转的条件(将根节点的空节点视为黑色),因此旋转后根节点不能为红色,因此我们必须在树中执行重新着色,从而得到上面显示的树。

现在,当我们插入新元素时,具有红色的父节点和子节点再次出现,在这里我们必须为它们重新着色。我们看到父节点和叔节点都具有红色,因此我们只需将其颜色更改为黑色,并将祖父颜色更改为红色。现在,由于祖父是根节点,因此我们再次将其颜色更改为黑色,从而得到上面显示的树。

最终树结构:

最终的树看起来像这样

请参考C程序来插入红黑树 完整实现上述算法。

红黑树|套装3(删除)