Antes de profundizar en los algoritmos específicos de AVL y Red-Black Tree, conviene repasar cuatro conceptos que ambos comparten: cómo medir la altura, calcular el factor de equilibrio, usar rotaciones y entender por qué las complejidades siguen siendo logarítmicas.
La altura es la cantidad de aristas del camino más largo desde la raíz hasta una hoja. Se usa como indicador de la profundidad de búsqueda.
1 + max(altura(hijoIzq), altura(hijoDer)).O(log n); es la propiedad que queremos preservar.int alturaNodo(struct NodoBalanceado *n) {
return n ? n->altura : -1;
}
El factor de equilibrio (FB, factor de balance) compara las alturas de los subárboles izquierdo y derecho de un nodo.
int factorBalance(struct NodoBalanceado *n) {
if (!n) return 0;
return alturaNodo(n->izquierdo) - alturaNodo(n->derecho);
}
Las rotaciones son transformaciones locales que reordenan nodos para recuperar el balance sin perder el orden del BST. Se aplican tanto en AVL como en Red-Black Tree.
struct NodoBalanceado *rotarDerecha(struct NodoBalanceado *y) {
struct NodoBalanceado *x = y->izquierdo;
struct NodoBalanceado *t2 = x->derecho;
x->derecho = y;
y->izquierdo = t2;
y->altura = 1 + max(alturaNodo(y->izquierdo), alturaNodo(y->derecho));
x->altura = 1 + max(alturaNodo(x->izquierdo), alturaNodo(x->derecho));
return x;
}
Actualizar alturas tras cada rotación evita cálculos repetidos y mantiene coherente el FB en el camino de regreso.
La motivación del balanceo es sostener la complejidad O(log n) en las operaciones principales:
Estas garantías son las que habilitan a usar estas estructuras en sistemas que deben responder rápido y de forma estable aun con datos adversos.