Atlasingeniería

Estructuras de datosÁrbolesTema 3

Cómo se balancean AVL y árboles rojo-negro

Un árbol balanceado limita su altura mediante rotaciones. AVL y rojo-negro mantienen garantías logarítmicas con distintas reglas y costos de actualización.

Para este tema conviene tener claro:Árboles binarios de búsqueda

Insertar claves ordenadas puede convertir un árbol de búsqueda en una lista. Para impedirlo, los árboles balanceados detectan ramas demasiado desparejas y reorganizan enlaces sin romper el orden de las claves.

Qué significa balancear, exactamente

Balancear no significa que todos los niveles estén completos. Significa imponer reglas que mantengan la altura en O(logn)O(\log n). Entonces buscar, insertar y borrar conservan su garantía logarítmica incluso para secuencias de entrada adversas.

La reorganización debe preservar la invariante del ABB. No se cambian claves arbitrariamente: se cambia qué nodo ocupa la raíz local y cómo se conectan sus subárboles.

Antes de seguir, predecí

Un árbol AVL y uno rojo-negro con un millón de claves. ¿Cuál tiene menos altura?

La rotación, el único movimiento que hay

Una rotación derecha eleva al hijo izquierdo y baja la raíz hacia la derecha. Una rotación izquierda hace el movimiento simétrico. Ambas mantienen el recorrido inorden, por lo que conservan el conjunto de claves ordenado.

Cuando el desequilibrio forma un zigzag hacen falta dos rotaciones: primero se endereza el hijo y después se rota la raíz. Cada rotación toca una cantidad constante de enlaces y cuesta O(1)O(1).

Insertamos 10. Un solo nodo, altura 0.

1 / 5
Insertar ordenado es el peor caso del ABB. La rotación no toca las claves: cambia quién es la raíz local y a quién se cuelga cada subárbol, y el recorrido inorden sigue dando 10, 20, 30.

AVL: el factor de balance

Un AVL guarda o calcula el factor de balance de cada nodo:

b(v)=h(vL)h(vR).b(v)=h(v_L)-h(v_R).

Exige que ese factor sea 1-1, 00 o 11. Después de insertar o borrar, recorre el camino hacia la raíz, actualiza alturas y rota donde la regla se rompe. Su balance estricto produce búsquedas muy predecibles, a cambio de más ajustes durante modificaciones.

Rojo-negro: un bit de color

Un árbol rojo-negro agrega un bit conceptual de color. Entre otras reglas, la raíz es negra, un nodo rojo no tiene hijo rojo y todos los caminos desde un nodo hasta hojas vacías contienen la misma cantidad de nodos negros.

Estas propiedades permiten caminos de longitudes distintas, pero garantizan que el más largo no supere el doble del más corto. La altura sigue siendo O(logn)O(\log n). Inserciones y borrados reparan colores y, cuando hace falta, aplican rotaciones.

Cuál de los dos, y por qué carga

AVL mantiene una forma más rígida y suele favorecer cargas con muchas búsquedas. Rojo-negro acepta algo más de desnivel y suele requerir menos rotaciones en cargas con muchas escrituras.

No es una ley universal de rendimiento: caché, implementación y patrón de claves también importan. Las bibliotecas suelen elegir rojo-negro para mapas y conjuntos ordenados porque ofrece buenas garantías con actualizaciones moderadas.

Cuál de todos, en la práctica

AVLRojo-negroÁrbol B+
Qué tan balanceadomuy: alturas difieren en 1menos: una rama puede ser el dobleperfecto por construcción
Altura típica≈ 1,44 log n≈ 2 log n3 o 4 niveles con millones
Búsquedasmás rápidasun poco más lentaslas mejores en disco
Inserciones y borradosmás rotacionesmenos rotacionesdivisiones de página
Dónde se usacuando se lee mucho más de lo que se escribebibliotecas estándar, planificadoresbases de datos, sistemas de archivos
Es el mismo canje de siempre: balancear mejor cuesta más al escribir. Las bibliotecas estándar eligen rojo-negro porque no saben qué proporción de lecturas y escrituras va a tener quien las use.
Más a fondo · nivel seniorLos que aparecieron después, y por qué

Las estructuras nuevas de las últimas décadas no balancean mejor: cambian qué optimizan.

Un treap o una skip list consiguen O(logn)O(\log n) esperado usando azar en vez de reglas, y a cambio el código es mucho más corto y más fácil de hacer concurrente. Redis usa skip lists para sus conjuntos ordenados por eso, no por velocidad.

Un splay tree no mantiene ninguna garantía por operación y mueve lo último consultado a la raíz, así que es rapidísimo cuando los accesos se repiten. Es la estructura correcta para una caché y la equivocada para un sistema con requisitos de latencia.

Y un árbol LSM —el que hay debajo de LevelDB, RocksDB y Cassandra— renuncia a tener una sola estructura ordenada: escribe en memoria y vuelca a disco archivos ordenados que después fusiona. Hace las escrituras muchísimo más baratas y las lecturas un poco más caras, que es exactamente el canje que pide un sistema que recibe más de lo que consulta.

El patrón es el mismo en los cuatro: el árbol balanceado clásico es el punto de equilibrio, y cada variante se corre hacia un lado sabiendo qué está resignando.

Cierre

Las rotaciones reparan la forma sin alterar el orden. AVL controla diferencias de altura; rojo-negro controla colores y cantidad de nodos negros. Las reglas son distintas, pero el objetivo es el mismo: impedir que la altura crezca linealmente.

Autoevaluación

¿Lo entendiste?

¿Qué significa que un árbol esté balanceado?
Una rotación, ¿qué le hace al orden de las claves?
El factor de balance de un AVL es b(v) = h(izquierdo) − h(derecho). ¿Qué valores admite?
¿Por qué las bibliotecas suelen elegir rojo-negro para mapas y conjuntos ordenados?