Á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.
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í
Qué cuesta cada recorrido en memoria
Todo recorrido completo visita nodos y cuesta tiempo. El espacio auxiliar de DFS es , donde es la altura: guarda el camino activo. BFS guarda la frontera y puede usar , donde es el ancho máximo.
En un árbol muy ancho, la cola domina la memoria. En uno degenerado, la profundidad puede llegar a y una versión recursiva puede desbordar la pila.
Para qué sirve cada recorrido
| Recorrido | Orden | Para qué sirve |
|---|---|---|
| En orden | izquierdo, nodo, derecho | sacar las claves de un ABB ordenadas; validar que sea un ABB |
| Previo | nodo, izquierdo, derecho | copiar o serializar el árbol conservando la forma |
| Posterior | izquierdo, derecho, nodo | liberar memoria, calcular tamaños o alturas, evaluar expresiones |
| Por niveles | de arriba hacia abajo | imprimirlo, encontrar la profundidad mínima, recorrer por distancia |
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?
Práctica