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.def rotar_izquierda(nodo, raiz):
pivot = nodo.derecho
nodo.derecho = pivot.izquierdo
if pivot.izquierdo:
pivot.izquierdo.padre = nodo
pivot.padre = nodo.padre
if not nodo.padre:
raiz[0] = pivot
elif 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.def rotar_derecha(nodo, raiz):
pivot = nodo.izquierdo
nodo.izquierdo = pivot.derecho
if pivot.derecho:
pivot.derecho.padre = nodo
pivot.padre = nodo.padre
if not nodo.padre:
raiz[0] = pivot
elif 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.