如上图,插入52和60的位置分别是RR情况和LL情况。
RR情况:父节点为祖父节点的右节点,插入节点为父节点的右节点
LL情况:父节点为祖父节点的左节点,插入节点为父节点的左节点
这两种情况很明显,插入节点为红色,父节点也为红色,父节点的子节点为红色显然违背了红黑树的性质四,我们需要对这种情况进行修复,使其重新满足红黑树性质。
判定条件:uncle 不是红色节点。
这里的两种情况,他们的插入节点都是没有叔父节点的,所以叔父节点也不可能是红色。
案例修复:
我们在红黑树等价转换那一章节也讲过了,红黑树等价转换成B树之后,B树节点的中间节点(父节点)都是黑色,两边的节点(子节点)都是红色。但是上面两种情况插入后,插入位置的B树节点并不满足这个条件,所以我们对其进行修复,使其满足B树节点的条件之后,也就重新恢复了红黑树性质。
B树节点中的中间节点大小介于两个子节点之间。以上图RR情况为例,插入节点52的原父节点应该放在B树节点中间的位置,应当将其染成黑色。插入节点52的原祖父节点46,应当将其转换为插入节点原父节点的子节点,所以将其染成红色。LL情况同理
完成染色之后,需要对原祖父节点进行单旋操作,来进行父节点,子节点的重新分配。以上图为例:
- RR情况应该原祖父节点46左旋,将插入节点的原父节点50旋转到中间的位置。
- LL情况应当原祖父节点76右旋,将插入节点的原父节点72旋转到中间的位置。
修复之后的结果如下图:
修复步骤总结:
- parent 染成黑色,grand 染成红色
- grand 进行单旋操作
- LL:右旋转
- RR:左旋转
如上图,插入48和74的位置分别是RL情况和LR情况。
RL情况:父节点为祖父节点的右节点,插入节点为父节点的左节点
LR情况:父节点为祖父节点的左节点,插入节点为父节点的右节点
这两种情况和上面的两种情况一样,插入节点为红色,父节点也为红色,父节点的子节点为红色显然违背了红黑树的性质四,我们需要对这种情况进行修复,使其重新满足红黑树性质。
判定条件:uncle 不是红色节点。
这两种情况的插入节点也是没有叔父节点的。
案例修复:
B树节点中的中间节点大小介于两个子节点之间。以上图RL情况为例,插入节点48大小介于原父节点和原祖父节点之间,它应该是B树节点中的中间节点,所以将插入节点48染成黑色,将原祖父节点46染成红色来作为插入节点的子节点。LR情况同理
完成染色之后,需要进行双旋操作,来进行父节点,子节点的重新分配。以上图为例:
- RL情况应该原父节点50右旋,将插入节点48上移到原父节点50的高度,然后将插入节点的原祖父节点46进行左旋,将插入节点48移动到中间位置,成为中间节点。
- LR情况应该原父节点72左旋,将插入节点74上移到原父节点72的高度,然后将插入节点的原祖父节点76进行右旋,将插入节点74移动到中间位置,成为中间节点。
修复之后的结果如下图:
修复步骤总结:
- 插入节点染成黑色,grand 染成红色
- 进行双旋操作
- LR:parent 左旋转, grand 右旋转
- RL:parent 右旋转, grand 左旋转