Lecciones · #5 de 11

Árboles Binarios

Un nodo, dos hijos — toda estructura de datos recursiva

Binary tree · traversal orders

pick a traversal → · preorder / inorder / postorder / level
init

Pruébalo: Inserta algunos valores. Luego prueba cada recorrido — preorden, inorden, postorden, por niveles — y observa cómo se ilumina el orden de visita debajo del árbol.

Por qué importa

Los árboles son la estructura natural para datos jerárquicos: sistemas de archivos, documentos HTML, organigramas, árboles de decisión. Los árboles binarios son la base de los ABB (árboles binarios de búsqueda), los montículos y el análisis de expresiones.

La idea

Imagina un árbol genealógico, pero donde cada persona tiene como máximo dos hijos (izquierdo y derecho). Comienza desde un único ancestro raíz.

Eso es un árbol binario. Cada nodo tiene como máximo dos hijos.

Los árboles abren nuevas formas de organizar datos:

Los recorridos visitan los nodos en distintos órdenes:

Puntos clave

Profundizando

Un árbol binario completo llena cada nivel antes de comenzar el siguiente (excepto, posiblemente, el último nivel). Un árbol binario lleno tiene cada nodo con 0 o 2 hijos. Un árbol binario perfecto es a la vez completo y lleno. Estas distinciones importan para las implementaciones de montículos (que requieren ser completos) y para el balanceo de árboles.

La fórmula "máximo de nodos en el nivel k = 2ᵏ" surge por inducción: el nivel 0 tiene un nodo (la raíz); cada nivel tiene a lo sumo el doble del anterior. Sumar la serie geométrica desde el nivel 0 hasta la altura h da un máximo de 2^(h+1) − 1 nodos. Invirtiendo: un árbol balanceado de n nodos tiene altura ⌊log₂ n⌋.

En la práctica

Detalles matemáticos

Propiedades del árbol
máx. de nodos en el nivel k 2ᵏ
máx. de nodos en el árbol, altura h 2ʰ⁺¹ − 1
altura mínima, n nodos ⌊log₂ n⌋
altura máxima (degenerado) n − 1
Tiempo de recorrido
O(n) — cada nodo se visita exactamente una vez
Espacio
recorrido recursivo O(h) en la pila de llamadas
iterativo (BFS) O(w) donde w es el nivel más ancho

Implementación

Nodo de árbol binario

struct TreeNode<T> {
    data: T,
    left: Option<Box<TreeNode<T>>>,
    right: Option<Box<TreeNode<T>>>,
}

// Recorrido inorden (recursivo)
fn inorder(node: Option<&Box<TreeNode<T>>>) {
    if let Some(n) = node {
        inorder(n.left.as_ref());
        process(n.data);
        inorder(n.right.as_ref());
    }
}

Órdenes de recorrido

Práctica

Tres problemas, cada uno enseñando una forma distinta de recursión:

Explora todos los problemas de práctica