En los árboles Red-Black, las rotaciones izquierda/derecha y el recoloreo corrigen violaciones al insertar o eliminar sin perder altura O(log n). Las reglas dependen del color del padre, del tío y de la forma (línea o zig-zag) que adopta el nodo nuevo o el nodo problemático.
Gira un subárbol para acercar al hijo derecho hacia la raíz local y bajar al nodo original a la izquierda. Se usa cuando hay sesgo a la derecha o en el caso tío negro con forma en L.
pivot = nodo->derecho; el hijo derecho sube.nodo->derecho = pivot->izquierdo; mueve el subárbol central.pivot->izquierdo = nodo; enlaza al antiguo padre debajo del pivote.RbNode *rotarIzquierda(RbNode *nodo, RbNode **raiz) {
RbNode *pivot = nodo->derecho;
nodo->derecho = pivot->izquierdo;
if (pivot->izquierdo) pivot->izquierdo->padre = nodo;
pivot->padre = nodo->padre;
if (!nodo->padre) {
*raiz = pivot;
} else if (nodo == nodo->padre->izquierdo) {
nodo->padre->izquierdo = pivot;
} else {
nodo->padre->derecho = pivot;
}
pivot->izquierdo = nodo;
nodo->padre = pivot;
return pivot;
}
Simétrica a la izquierda: acerca al hijo izquierdo y baja al nodo original hacia la derecha. Se aplica ante sesgo a la izquierda o en casos tío negro con forma en J invertida.
pivot = nodo->izquierdo; el hijo izquierdo sube.nodo->izquierdo = pivot->derecho; conserva el subárbol medio.pivot->derecho = nodo; reubica al nodo original.RbNode *rotarDerecha(RbNode *nodo, RbNode **raiz) {
RbNode *pivot = nodo->izquierdo;
nodo->izquierdo = pivot->derecho;
if (pivot->derecho) pivot->derecho->padre = nodo;
pivot->padre = nodo->padre;
if (!nodo->padre) {
*raiz = pivot;
} else if (nodo == nodo->padre->derecho) {
nodo->padre->derecho = pivot;
} else {
nodo->padre->izquierdo = pivot;
}
pivot->derecho = nodo;
nodo->padre = pivot;
return pivot;
}
Si el padre es rojo y el tío también es rojo, hay dos rojos consecutivos. La solución es solo recolorear:
Se mantiene la cantidad de nodos negros por camino y se empuja la posible violación hacia arriba sin rotar.
Si el padre es rojo y el tío es negro (o NIL), se requieren rotaciones para evitar dos rojos consecutivos. Se analizan dos formas:
Tras la rotación final, el nuevo padre de la subestructura se colorea negro y el abuelo original se colorea rojo. Esto elimina los rojos consecutivos y preserva la altura negra.