Árboles binarios de búsqueda
Un ABB mantiene claves menores a la izquierda y mayores a la derecha. Esa invariante guía búsqueda, inserción y borrado, pero sólo es rápida si la altura se mantiene baja.
Para este tema conviene tener claro:Árboles binarios y recorridos
Un árbol binario no es automáticamente rápido para buscar. La ventaja aparece cuando cada nodo mantiene una regla: claves menores de un lado, mayores del otro. Esa regla permite descartar un subárbol entero en cada comparación.
La invariante que ordena el árbol
En un árbol binario de búsqueda, o ABB, todas las claves del subárbol izquierdo son menores que la clave del nodo y todas las del derecho son mayores. La condición vale recursivamente en cada subárbol.
Los duplicados requieren una política explícita: rechazarlos, contar repeticiones dentro del nodo o adaptar una desigualdad para ubicarlos siempre del mismo lado. Sin una regla consistente, búsqueda e inserción dejan de compartir la misma invariante.
El árbol cumple la invariante: todo lo del subárbol izquierdo de 8 es menor que 8, y todo lo del derecho es mayor.
Antes de seguir, predecí
Buscar es bajar por un camino
Para buscar una clave, empezamos en la raíz. Si coincide, terminamos. Si es menor, seguimos por la izquierda; si es mayor, por la derecha:
type BinaryNode<T> = {
value: T;
left: BinaryNode<T> | null;
right: BinaryNode<T> | null;
};
const contains = (root: BinaryNode<number> | null, target: number): boolean => {
let current = root;
while (current) {
if (target === current.value) return true;
current = target < current.value ? current.left : current.right;
}
return false;
};El costo es proporcional a la altura : .
Insertar donde la búsqueda se queda sin lugar
Insertar sigue el mismo camino que buscar hasta encontrar un enlace vacío. Ahí conecta el nuevo nodo. La inserción local cuesta ; encontrar su lugar cuesta .
Después de insertar, el recorrido inorden sigue ordenado. Esa es una prueba útil de la invariante, pero no alcanza para detectar todos los errores: también hay que verificar que cada subárbol respete límites heredados de sus ancestros.
Borrar, que tiene tres casos
Borrar tiene tres casos. Una hoja puede desconectarse. Un nodo con un solo hijo se reemplaza por ese hijo. Un nodo con dos hijos se reemplaza por su sucesor en inorden, el menor del subárbol derecho, y luego se elimina ese sucesor de su posición original.
El tercer caso no copia un hijo arbitrario: debe elegir una clave que conserve todas las desigualdades a ambos lados.
Todo depende de la altura
Si el árbol está razonablemente balanceado, es y las operaciones son logarítmicas. Si insertamos claves ya ordenadas en un ABB común, cada nodo puede quedar como hijo derecho del anterior. La estructura se convierte en una lista y .
Por eso decir que un ABB busca en necesita una condición sobre su forma. Sin balanceo, el peor caso es .
Cuándo un ABB y cuándo otra cosa
| ABB balanceado | Tabla hash | Arreglo ordenado | |
|---|---|---|---|
| Buscar una clave | O(log n) | O(1) promedio | O(log n) |
| Insertar o borrar | O(log n) | O(1) promedio | O(n) |
| Mínimo y máximo | O(log n) | O(n) | O(1) |
| Recorrer en orden | O(n), natural | no puede | O(n), natural |
| Buscar un rango | O(log n) más el rango | no puede | O(log n) más el rango |
| El siguiente mayor a x | O(log n) | no puede | O(log n) |
La pregunta que decide es si el orden importa. «Dame los pedidos de esta semana», «cuál es el próximo turno después de las 14», «los diez productos más caros»: las tres necesitan orden, y una tabla hash no puede contestarlas sin mirar todo. Si en cambio la única pregunta es «dame el usuario con este identificador», el árbol está pagando por una capacidad que nadie usa.
Cierre
El ABB convierte comparaciones en decisiones de izquierda o derecha. Buscar, insertar y borrar cuestan , no automáticamente . La invariante mantiene el orden; un mecanismo adicional de balanceo es el que controla la altura.
Autoevaluación
¿Lo entendiste?
Práctica