在上一篇文章中,我们讨论了红黑树的介绍。在这篇文章中,讨论了插入。在AVL树插入中,我们使用旋转作为工具来在插入后进行平衡。在红黑树中,我们使用两种工具进行平衡。
- 重新着色
- 回转
重新着色是节点颜色的变化,即如果颜色为红色,则将其更改为黑色,反之亦然。必须注意的是,NULL节点的颜色始终为黑色。而且,我们总是先尝试重新着色,如果重新着色不起作用,则我们进行旋转。以下是详细的算法。该算法主要有两种情况,具体取决于叔叔的肤色。如果叔叔是红色的,我们会重新着色。如果叔叔是黑人,我们会进行轮换和/或重新上色。
我们将使用的表示形式是:
逻辑:
首先,您必须像在二叉树中那样插入节点,并为其分配红色。现在,如果该节点是根节点,则将其颜色更改为黑色,但如果不是,则将其检查父节点的颜色。如果它的颜色是黑色,则不要更改颜色,但是如果颜色不是红色,则请检查节点的叔叔的颜色。如果节点的叔叔是红色,则将节点的父母和叔叔的颜色更改为黑色,将祖父的颜色更改为红色,并为他(即祖父)重复相同的过程。
但是,如果节点的叔叔为黑色,则可能有4种情况:
- 左左外壳(LL旋转):
- 左右案例(LR旋转):
- 右右案例(RR旋转):
- 左右案例(RL旋转):
现在,在这些旋转之后,如果节点的颜色未匹配,则需要重新着色。
算法:
令x为新插入的节点。
- 执行标准的BST插入,并使新插入的节点的颜色为红色。
- 如果x为根,请将x的颜色更改为BLACK(完整树的黑色高度增加1)。
- 如果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的红黑树。
解决方案: