颜色翻转
- 颜色翻转过程概述:
- 颜色翻转的触发场景:向2-3树中的3节点添加元素,新添加的元素要添加到3节点的最右侧;
- 对应到红黑树中的情形是:新添加的红节点在黑节点右侧,黑节点的左侧还有一个红节点,红黑树中的这种形态对应到2-3树中就是一个临时的4节点;
- 2-3树中临时的4节点要拆成3个2节点,这种形态对应到红黑树中就是3个黑节点;
- 2-3树在拆成3个2节点后,要向上融合,3个2节点中间的那个节点是要融合的,所以它是红色的;
- 最后从结果看,从一添加的“红-黑-红”,到拆完后形成的“黑-红-黑”,正好形成颜色的翻转,即所谓的颜色翻转;
- 红黑树中涉及的一些结论:
- 红黑树中,如果一个黑节点左侧没有红色节点的话,它本身就代表2-3树中一个单独的2节点;
- 3个2节点对应到红黑树中表示的是这3个节点都是黑节点;
- 2-3树中,临时的4节点在拆完后还要向上融合,融合意味着,2-3树中临时4节点在拆完后向上融合的根,在红黑树中是红色的;
颜色翻转代码
- 调用该方法的先决条件是:node - 黑,node.left - 红,node.right - 红;
// 颜色翻转
private void flipColors(Node node){
node.color = RED;
node.left.color = BLACK;
node.right.color = BLACK;
}
右旋转
- 右旋转触发的场景:新添加的元素要融合到3节点的最左边;
- 对应到红黑树中的场景是:根节点是黑,根节点的左孩子是红,根节点左孩子的左孩子是红;
- 旋转过后,3个节点还是对应着2-3树中的临时4节点,所以左右2个孩子的颜色都得是红的,红-黑-红,这就对应到了颜色翻转的情况了,继而进行颜色翻转;
右旋转代码
// node x
// / \ 右旋转 / \
// x T2 -------> y node
// / \ / \
// y T1 T1 T2
private Node rightRotate(Node node){
Node x = node.left;
// 右旋转
node.left = x.right;
x.right = node;
x.color = node.color;
node.color = RED;
return x;
}