8 - Comparación entre árboles binarios y generales

Los árboles binarios y los n-arios comparten conceptos básicos, pero la flexibilidad adicional de un árbol general introduce nuevos costos y oportunidades. En esta sección comparamos ambos enfoques desde la perspectiva de implementaciones en C.

8.1 Flexibilidad de la estructura

Los árboles binarios limitan cada nodo a dos hijos, lo que permite representar decisiones dicotómicas y estructuras equilibradas con facilidad. Los árboles generales permiten un número variable de hijos y son ideales para jerarquías complejas.

En C, la representación LCRS convierte cualquier árbol general en un binario interno, lo que nos deja reutilizar estructuras e incluso alternar entre ambos modelos según la necesidad.

8.2 Complejidad de recorridos

Independientemente del número de hijos, los recorridos visitan cada nodo una sola vez, lo que significa que el costo temporal sigue siendo O(n). La diferencia está en las estructuras auxiliares utilizadas:

  • Binarios: los recorridos inorden, preorden y postorden utilizan dos llamadas recursivas estrictas o pilas de tamaño proporcional a la altura.
  • Generales: los recorridos iteran por listas de hermanos; las pilas o colas deben contemplar que un nodo puede empujar docenas de hijos.

Con representaciones como LCRS podemos ejecutar los mismos algoritmos que en un binario, pero los casos de test listan varios hijos para validar que las estructuras auxiliares soportan una carga mayor.

8.3 Costos de memoria

Un árbol binario requirió siempre dos punteros por nodo; los generales agregan enlaces adicionales para representar la lista de hijos o arreglos de hijos. El costo depende de la representación elegida:

  • Array fijo: requiere reservar MAX_HIJOS punteros por nodo aunque no se utilicen.
  • Lista dinamica: conserva el puntero a la lista y requiere nodos auxiliares (ChildNode).
  • LCRS: solo necesita dos punteros, similar al binario, pero requiere recorrer hermanos de forma secuencial.

Cuando el fan-out medio es bajo, los costos se aproximan a los de un binario. Al incrementar el número de hijos, conviene monitorear el uso de memoria y considerar el movimiento a estructuras de disco (B-Trees, tries) si es necesario.

8.4 Eficiencia en búsqueda e inserción

En un árbol binario de búsqueda equilibrado las operaciones se realizan en O(log n). En un árbol general no existe un equivalente directo salvo que agreguemos reglas de ordenamiento en cada nivel. Algunos enfoques prácticos:

  • Si necesitamos búsqueda rápida, podemos ordenar los hijos de cada nodo y realizar una búsqueda binaria local.
  • Para inserciones frecuentes, la lista de hijos con inserción O(1) al inicio minimiza el costo.
  • Cuando cada nodo representa una clave (como en tries), la búsqueda se ajusta a las mismas reglas que un árbol binario de búsqueda tradicional.

La eficiencia depende de la disciplina aplicada: un árbol general sin restricciones puede requerir búsquedas lineales por nivel.

8.5 Cuándo conviene usar uno u otro

Escenario Árbol binario Árbol general
Indices ordenados Ideal: BST, AVL, Red-Black Posible con reglas adicionales
Jerarquías flexibles Requiere nodos ficticios Modelo natural
Memoria ajustada Consumo constante por nodo Depende del fan-out y enlace
Serialización a formatos como JSON Necesita conversiones Se exporta directamente

Si el problema exige decisiones binarias (comparaciones, estructuras de índices) un árbol binario sigue siendo la opción más eficiente. Para jerarquías con número variable de hijos, los árboles generales reducen la complejidad.

8.6 Ejemplos prácticos

  • Arbol binario: arboles de expresiones matemáticas, estructuras de prioridad, índices balanceados.
  • Arbol general: directorios de sistemas, escenas de videojuegos, estructuras DOM, catálogos de productos.

Combinar ambos modelos es común: podemos almacenar un árbol general para representar la estructura global y mantener índices binarios para búsquedas específicas dentro de cada nivel.