Los Red-Black Tree (RB) conservan altura O(log n) permitiendo recoloreos y rotaciones en inserciones y eliminaciones. El balance es más laxo que en AVL, pero a cambio cada operación requiere a lo sumo un puñado de cambios locales.
En los árboles Red-Black, las hojas nulas (NIL) son nodos especiales ficticios que no contienen datos y sirven para simplificar la lógica.
¿Qué son exactamente las hojas NIL?
left = null o right = null, muchos códigos usan un nodo NIL global para todas las hojas vacías.¿Por qué existen?
null. (10, negro)
/ \
(5, rojo) (15, negro)
/ \ / \
NIL NIL NIL NIL
Resumen corto: las hojas NIL representan la ausencia de hijo, siempre son negras y simplifican tanto las propiedades como las implementaciones.
El algoritmo usa recoloreo y rotaciones para restaurar las reglas tras insertar o eliminar. Si se viola la regla de rojos consecutivos, se recolorea al padre/tío o se rota el subárbol afectado. La igualdad de nodos negros por camino se mantiene ajustando colores y rotaciones hasta que la raíz quede negra.
Una estructura típica guarda el color y, opcionalmente, una referencia al padre para simplificar los casos de rebalanceo.
ROJO = "ROJO"
NEGRO = "NEGRO"
class RbNode:
def __init__(self, clave, color=ROJO, padre=None):
self.clave = clave
self.color = color
self.izquierdo = None
self.derecho = None
self.padre = padre # opcional pero facilita recoloreos
def es_rojo(nodo):
return nodo is not None and nodo.color == ROJO
def es_negro(nodo):
return nodo is None or nodo.color == NEGRO
La restricción de black-height garantiza que el camino más largo es a lo sumo el doble del más corto. Formalmente, la altura de un RB es ≤ 2 × log2(n + 1). Esto basta para que buscar, insertar y eliminar sigan siendo O(log n) sin exigir el balance estricto de AVL.