Saltar al contenido principal

Árboles Binarios de Búsqueda

Un Árbol Binario de Búsqueda (BST - Binary Search Tree) es una estructura de datos jerárquica en forma de árbol binario que mantiene los elementos ordenados para permitir búsquedas, inserciones y eliminaciones eficientes.

Las propiedades clave de un BST son:

  • Cada nodo tiene como máximo dos hijos: izquierdo y derecho.
  • Para cualquier nodo N:
    • Todos los elementos en el subárbol izquierdo son menores que N.value.
    • Todos los elementos en el subárbol derecho son mayores que N.value.
  • No se permiten elementos duplicados (por convención).

Complejidades Operacionales

OperaciónMejor CasoPromedioPeor Caso (árbol degenerado)
BúsquedaO(logn)O(log n)O(logn)O(log n)O(n)O(n)
InserciónO(logn)O(log n)O(logn)O(log n)O(n)O(n)
EliminaciónO(logn)O(log n)O(logn)O(log n)O(n)O(n)

Diagrama de secuencia

Inserción

Búsqueda

Eliminación

Ejemplo técnico

BinaryNode.java
package domain;

public class BinaryNode {
public int value;
public BinaryNode left;
public BinaryNode right;

public BinaryNode(int value) {
this.value = value;
this.left = null;
this.right = null;
}
}
BinaryTree.java
package application;

import domain.BinaryNode;

public class BinaryTree {
public BinaryNode root;

public void insert(int value) {
root = insertRec(root, value);
}

private BinaryNode insertRec(BinaryNode node, int value) {
if (node == null) return new BinaryNode(value);
if (value < node.value) node.left = insertRec(node.left, value);
else if (value > node.value) node.right = insertRec(node.right, value);
return node;
}

public boolean search(int value) {
return searchRec(root, value);
}

private boolean searchRec(BinaryNode node, int value) {
if (node == null) return false;
if (node.value == value) return true;
return value < node.value ? searchRec(node.left, value) : searchRec(node.right, value);
}

public void inOrder() {
inOrderRec(root);
System.out.println();
}

private void inOrderRec(BinaryNode node) {
if (node != null) {
inOrderRec(node.left);
System.out.print(node.value + " ");
inOrderRec(node.right);
}
}

public void preOrder() {
preOrderRec(root);
System.out.println();
}

private void preOrderRec(BinaryNode node) {
if (node != null) {
System.out.print(node.value + " ");
preOrderRec(node.left);
preOrderRec(node.right);
}
}

public void postOrder() {
postOrderRec(root);
System.out.println();
}

private void postOrderRec(BinaryNode node) {
if (node != null) {
postOrderRec(node.left);
postOrderRec(node.right);
System.out.print(node.value + " ");
}
}

public void delete(int value) {
root = deleteRec(root, value);
}

private BinaryNode deleteRec(BinaryNode node, int value) {
if (node == null) return null;

if (value < node.value) {
node.left = deleteRec(node.left, value);
} else if (value > node.value) {
node.right = deleteRec(node.right, value);
} else {
if (node.left == null) return node.right;
if (node.right == null) return node.left;

BinaryNode minRight = findMin(node.right);
node.value = minRight.value;
node.right = deleteRec(node.right, minRight.value);
}
return node;
}

private BinaryNode findMin(BinaryNode node) {
while (node.left != null) node = node.left;
return node;
}
}

Aplicaciones prácticas de los BST

  • Sistemas de búsqueda rápida (e.g., árboles de índices en bases de datos).
  • Compiladores (símbolos ordenados).
  • Manejo de directorios o árboles de archivos.
  • Autocompletado (cuando se combinan con trie o AVL).
  • Algoritmos como Huffman Tree usan variantes de BST.

Referencias