Atlasingeniería

Estructuras de datosÁrbolesTema 1

Árboles binarios y recorridos

Un árbol representa jerarquías mediante subárboles. El orden en que visitamos raíz, izquierda y derecha determina qué información produce cada recorrido.

Para este tema conviene tener claro:Pensar en recursivo

Una lista tiene un único siguiente. Un árbol puede abrir varios caminos. Para procesarlo no alcanza con avanzar: hay que decidir en qué orden visitar cada rama y qué hacer cuando el camino termina.

Un árbol es una definición recursiva

Un árbol binario está vacío o contiene una raíz y dos subárboles, izquierdo y derecho:

type BinaryNode<T> = {
  value: T;
  left: BinaryNode<T> | null;
  right: BinaryNode<T> | null;
};

Los nodos sin hijos son hojas. La profundidad cuenta enlaces desde la raíz hasta un nodo; la altura mide el camino más largo desde un nodo hasta una hoja. Estas medidas describen la forma del árbol, no la cantidad total de nodos.

Los tres recorridos en profundidad

Los recorridos en profundidad terminan una rama antes de pasar a otra. En preorden visitamos raíz, izquierda y derecha. En inorden hacemos izquierda, raíz y derecha. En postorden dejamos la raíz para el final: izquierda, derecha y raíz.

Las tres variantes recorren los mismos nodos. Lo único que cambia es el momento en que se procesa la raíz respecto de sus subárboles.

Bajamos por la izquierda hasta el fondo antes de procesar nada. Primer nodo visitado: el 4.

1 / 5
Recorrido en inorden: izquierda, raíz, derecha. Los mismos cinco nodos en preorden saldrían 1, 2, 4, 5, 3; en postorden, 4, 5, 2, 3, 1.

Inorden, escrito tal cual se define

Una implementación de inorden refleja directamente la definición:

const inOrder = <T>(node: BinaryNode<T> | null, values: T[]): void => {
  if (!node) return;
  inOrder(node.left, values);
  values.push(node.value);
  inOrder(node.right, values);
};

En un árbol binario de búsqueda, este recorrido produce las claves ordenadas. Preorden sirve para procesar padres antes que hijos; postorden, para liberar o calcular algo de los hijos antes de combinarlo en el padre.

Por niveles, con una cola

El recorrido en anchura, BFS, visita por niveles. Usa una cola: entra la raíz, sale el próximo nodo y entran sus hijos. Así se procesan primero todos los nodos de profundidad cero, luego los de profundidad uno y sucesivamente.

BFS es útil para encontrar la menor cantidad de enlaces hasta un objetivo o para imprimir una jerarquía nivel por nivel. DFS usa una pila explícita o la pila de llamadas; BFS necesita una cola.

Antes de seguir, predecí

Querés imprimir un árbol nivel por nivel, como se ve dibujado. ¿Qué recorrido usás?

Qué cuesta cada recorrido en memoria

Todo recorrido completo visita nn nodos y cuesta O(n)O(n) tiempo. El espacio auxiliar de DFS es O(h)O(h), donde hh es la altura: guarda el camino activo. BFS guarda la frontera y puede usar O(w)O(w), donde ww es el ancho máximo.

En un árbol muy ancho, la cola domina la memoria. En uno degenerado, la profundidad puede llegar a nn y una versión recursiva puede desbordar la pila.

Para qué sirve cada recorrido

RecorridoOrdenPara qué sirve
En ordenizquierdo, nodo, derechosacar las claves de un ABB ordenadas; validar que sea un ABB
Previonodo, izquierdo, derechocopiar o serializar el árbol conservando la forma
Posteriorizquierdo, derecho, nodoliberar memoria, calcular tamaños o alturas, evaluar expresiones
Por nivelesde arriba hacia abajoimprimirlo, encontrar la profundidad mínima, recorrer por distancia
El posterior es el que resuelve todo lo que necesita a los hijos ya calculados, y por eso es el de las funciones que devuelven algo del subárbol.

La regla para elegir es simple una vez que se ve: el recorrido se decide por cuándo hace falta el nodo respecto de sus hijos. Si el nodo se procesa antes, es previo; si hace falta que los hijos ya estén resueltos, es posterior; si el orden de las claves importa, es en orden.

Cierre

Un árbol binario se entiende como raíz más dos subárboles. Preorden, inorden y postorden cambian cuándo actúa la raíz; BFS cambia la estrategia completa y avanza por niveles. Elegí el recorrido según el orden que exige el resultado y la forma que puede tener el árbol.

Autoevaluación

¿Lo entendiste?

¿Qué cambia entre preorden, inorden y postorden?
Hay que liberar los nodos de un árbol. ¿Qué recorrido corresponde?
¿Cuánta memoria auxiliar usa cada recorrido?
Profundidad y altura, ¿son lo mismo?