Cargando aplicación...
Preparando tu experiencia meskeIA
Inserta, elimina y busca nodos. Compara un árbol binario de búsqueda simple con un AVL auto-balanceado y observa las rotaciones LL, RR, LR y RL paso a paso.
Inserción, borrado y rotaciones de auto-balanceado
| Característica | BST simple | AVL |
|---|---|---|
| Balanceo | No (peor caso: lista) | Auto-balanceado tras cada operación |
| Altura en el peor caso | O(n) | O(log n) — siempre |
| Búsqueda | O(log n) promedio, O(n) peor caso | O(log n) garantizado |
| Inserción | O(log n) promedio | O(log n) + 1 o 2 rotaciones |
| Borrado | O(log n) promedio | O(log n) + posibles rotaciones en cascada |
| Memoria por nodo | Valor + 2 punteros | Valor + 2 punteros + altura (o factor balance) |
| Cuándo usarlo | Datos aleatorios, simplicidad | Lecturas frecuentes, datos ordenados |
Si insertas valores ya ordenados (1, 2, 3, 4, 5...), cada nuevo nodo se va siempre a la derecha. El árbol acaba siendo una lista enlazada con altura n y búsqueda O(n). Pruébalo con el ejemplo “Inserción ordenada” en modo BST y compara con AVL.
Conclusión: los datos reales rara vez son aleatorios, así que en producción casi nunca se usa BST simple.
Para cada nodo: factor = altura(subárbol izquierdo) − altura(subárbol derecho). En un AVL siempre debe estar entre −1 y +1. Si llega a ±2, hay desbalanceo y se aplica una rotación.
En el simulador verás el número junto a cada nodo (en modo AVL). +1 = ligeramente cargado a la izquierda.
Cuando el desbalanceo está “en zig-zag”. Por ejemplo: insertas 3, después 1, después 2. El subárbol izquierdo de 3 está cargado a la derecha, así que primero se rota izquierda en el hijo y después derecha en el nodo desbalanceado. Es lo que llamamos LR.
Regla mnemotécnica: las rotaciones dobles tienen dos letras (LR, RL) y siempre rotan primero en el hijo y después en el padre.
Ambos están auto-balanceados. AVL es más estricto (factor balance entre −1 y +1): búsquedas más rápidas pero más rotaciones en inserciones/borrados. Red-Black permite algo más de desbalanceo: menos rotaciones, ideal cuando hay muchas escrituras.
Java TreeMap, C++ std::map y el kernel de Linux usan Red-Black, no AVL.
Tras eliminar un nodo, el desbalanceo puede propagarse hacia arriba. Hay que recalcular factores de balance subiendo por el camino y aplicar rotaciones en cada nodo desbalanceado, no solo en el primero. Esto puede generar varias rotaciones en cadena.
Pruébalo: carga el preset balanceado y elimina valores; observa rotaciones en cascada.
El recorrido inorden (izquierda → nodo → derecha). Es la propiedad clave de un BST: al recorrerlo en inorden, los valores salen ordenados de menor a mayor.
Si inviertes hijos izquierdo y derecho en el recorrido, obtienes orden decreciente.
Compara el valor nuevo con el nodo actual. Si es menor, baja a la izquierda; si es mayor, baja a la derecha. Cuando llegues a una posición vacía, crea ahí el nuevo nodo.
Mientras vuelves recursivamente hacia la raíz, recalcula altura(nodo) = 1 + máx(altura(izq), altura(der)) en cada nodo del camino.
Calcula FB = altura(izq) − altura(der). Si está entre −1 y +1, todo bien: continúa subiendo. Si es +2 o −2, ese nodo está desbalanceado y hay que rotar.
FB = +2 y el valor entró en el subárbol izquierdo del hijo izquierdo → LL (rotación derecha). FB = −2 y entró en el derecho del derecho → RR (rotación izquierda). Si entró en zig-zag, aplica rotación doble (LR o RL).
Tras una rotación, el nodo que estaba arriba ya no es la raíz del subárbol; lo es el que ocupa su sitio. Asegúrate de que el padre apunte al nuevo nodo, no al antiguo.
Carga un mismo preset primero en BST y después en AVL. Verás de un vistazo cómo las rotaciones aplanan el árbol y reducen su altura.
Es más fácil de actualizar y permite calcular el factor en O(1). El factor se deriva restando la altura de los hijos.
rotarDerecha(y) y rotarIzquierda(x) deben recibir un nodo y devolver la nueva raíz. No modifiques el padre dentro de la función: que el llamador asigne el resultado.
1, 2, 3, 4, 5... y 10, 9, 8, 7... son los casos peor para BST. Si tu AVL los maneja bien, las rotaciones están correctas.
Para árboles de millones de nodos, la recursión puede agotar la pila. Considera versiones iterativas con tu propia pila explícita.
Los AVL son ideales cuando necesitas iteración ordenada o búsqueda por rangos. Si solo importa “está o no está”, una tabla hash es más rápida.