Menu
Coddy logo textTech

Árbol binario

Última actualización

Un árbol binario es una jerarquía donde cada nodo tiene como máximo dos hijos, llamados hijo izquierdo e hijo derecho. El nodo superior es la raíz, los nodos sin hijos son hojas, y el número de aristas desde la raíz hasta la hoja más profunda es la altura del árbol. A diferencia de un árbol binario de búsqueda, un árbol binario simple no tiene regla de orden: es solo la forma. Pulsa reproducir arriba para ver cómo un árbol se llena nivel por nivel y luego se recorre en orden (izquierda, nodo, derecha).

Los árboles binarios sustentan muchas estructuras: árboles binarios de búsqueda, montículos, árboles de expresiones y más. Los recorridos visitan cada nodo en un orden definido: en orden, en preorden y en postorden son los tres recorridos en profundidad, cada uno útil para tareas distintas.

Terminología

TérminoSignificado
RaízEl nodo superior, sin padre
HojaUn nodo sin hijos
AlturaEl camino más largo de raíz a hoja (en aristas)
ProfundidadDistancia de un nodo respecto a la raíz
CompletoTodos los niveles llenos salvo quizá el último, llenado de izquierda a derecha

Los tres recorridos en profundidad

RecorridoOrdenUso común
En ordenIzquierda, nodo, derechaSalida ordenada de un BST
PreordenNodo, izquierda, derechaCopiar / serializar un árbol
PostordenIzquierda, derecha, nodoEliminar / evaluar un árbol

Ejemplo resuelto

Recorrido en orden del árbol construido a partir de [4, 2, 6, 1, 3, 5] (llenado nivel por nivel):

PasoEn el nodoAcción
14Se recurre al subárbol izquierdo de 4 antes de visitarlo
22Se recurre al subárbol izquierdo de 2 antes de visitarlo
31Hoja, sin hijo izquierdo: se visita 1, salida [1]
42Izquierda terminada: se visita 2, salida [1, 2], luego se recurre a la derecha
53Hoja: se visita 3, salida [1, 2, 3]
64Subárbol izquierdo terminado: se visita 4, salida [1, 2, 3, 4], luego se recurre a la derecha
75Hijo izquierdo de 6, una hoja: se visita 5, salida [1, 2, 3, 4, 5]
86Izquierda terminada, sin hijo derecho: se visita 6, salida [1, 2, 3, 4, 5, 6]

Cuándo usar un árbol binario

Úsalo cuandoEvítalo cuando
Necesitas modelar datos intrínsecamente jerárquicos (sistemas de archivos, árboles de expresiones, DOM)Los datos son planos y bastaría con una lista o un arreglo: un árbol solo añade sobrecarga
Quieres operaciones ordenadas y puedes mantenerlo equilibrado (un BST o un árbol autoequilibrado)Necesitas búsqueda por clave en O(1) promedio: una tabla hash supera a cualquier árbol
Necesitas procesar datos estructurados en orden, preorden o postordenLos nodos se insertan en orden ascendente en un BST no equilibrado: degenera en una lista O(n)
Importan las consultas por rango o la iteración ordenada, que las tablas hash no ofrecenLa memoria es escasa: cada nodo carga dos punteros a hijos además de los datos

Código de Binary Tree

Una implementación limpia y ejecutable de Binary Tree en Python, JavaScript, Java, C++, C. Elige un lenguaje, copia el código o ábrelo ya cargado en el Playground de Coddy.

Código de Binary Tree en Python

Python
1from collections import deque2
3
4class Node:5    def __init__(self, value):6        self.value = value7        self.left = None8        self.right = None9
10
11def insert(root, value):12    # Level-order insert: fill the first empty child slot found13    if root is None:14        return Node(value)15    queue = deque([root])16    while queue:17        node = queue.popleft()18        if node.left is None:19            node.left = Node(value)20            return root21        queue.append(node.left)22        if node.right is None:23            node.right = Node(value)24            return root25        queue.append(node.right)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.value] + inorder(node.right)32
33
34root = None35for value in [1, 2, 3, 4, 5, 6, 7]:36    root = insert(root, value)37
38print("Root:   ", root.value)39print("Inorder:", inorder(root))
Ejecuta este código en el Playground de Python

Preguntas frecuentes sobre árboles binarios

¿Cuál es la diferencia entre un árbol binario y un árbol binario de búsqueda?
Un árbol binario simplemente limita cada nodo a un máximo de dos hijos, sin orden alguno. Un árbol binario de búsqueda añade la regla de que todo en el subárbol izquierdo es menor y todo en el subárbol derecho es mayor, que es lo que hace rápida la búsqueda.
¿Qué es un recorrido en orden?
El recorrido en orden visita el subárbol izquierdo, luego el nodo y luego el subárbol derecho, de forma recursiva. Para un árbol binario de búsqueda esto produce los valores en orden ascendente, por lo que es el recorrido más común para demostrar.
¿Qué es un árbol binario completo?
Un árbol binario completo tiene todos los niveles totalmente llenos salvo quizá el último, que se llena de izquierda a derecha. Esta forma permite almacenar el árbol de forma compacta en un arreglo (sin necesidad de punteros a hijos), que es como se implementan los montículos binarios.
¿Cuándo debería usar un árbol binario en lugar de un arreglo o una tabla hash?
Recurre a un árbol cuando tus datos son naturalmente jerárquicos o cuando necesitas operaciones ordenadas como consultas por rango e iteración ordenada, algo que las tablas hash no ofrecen. Si solo necesitas búsqueda rápida por clave sin orden, el acceso promedio O(1) de una tabla hash supera a un árbol, y para datos planos un arreglo es más simple y aprovecha mejor la caché.
¿Cuál es la diferencia entre la altura y la profundidad de un árbol binario?
La profundidad se mide desde la raíz hacia abajo hasta un nodo concreto: el número de aristas del camino desde la raíz hasta ese nodo. La altura se mide desde un nodo hacia abajo hasta su hoja más profunda, por lo que la altura de todo el árbol es la profundidad de su nodo más profundo. Un árbol de un solo nodo tiene altura 0, y su único nodo también tiene profundidad 0.
¿Por qué un árbol binario no equilibrado rinde tan mal?
Buscar, insertar y eliminar en un árbol binario de búsqueda cuestan O(h), donde h es la altura. Cuando las claves se insertan en orden ascendente el árbol se convierte en una línea recta, por lo que h crece hasta n y cada operación degenera a O(n), nada mejor que una lista enlazada. Los árboles autoequilibrados como AVL o rojo-negro mantienen la altura en O(log n) para evitarlo.
Coddy programming languages illustration

Domina los algoritmos con Coddy

COMENZAR