Definición

Un BST es un árbol binario donde cada nodo tiene un valor clave, y todos los nodos en el subárbol izquierdo tienen claves menores o iguales, mientras que los del subárbol derecho tienen claves mayores.

Ejemplo de inserción

En el ejemplo anterior para (a) la inserción fue en el orden: 37, 24, 42, 7, 2, 40, 32, 120.

37 es el primer nodo, es el nodo raiz.

24 es menor que 37, será el hijo de la izquierda.

42 es mayor que 37, será el de la derecha. En este punto ya no pueden agregarse elementos como hijos de la raiz.

7 es menor que 37, a la izquierda pero ya está ocupado por 24. 7 es menor que 24, a la izquierda de éste.

2 es menor que 37, que 24 y que 7. A la izquierda de 7.

40 es mayor que 37 pero es menor que 42. A la izquierda de 42.

32 es menor que 37 (izquierda). Es mayor que 24 (derecha).

Por último, 120 es mayor que 37 (derecha). Mayor que 42 (derecha).

Remover nodos

Nodo hoja

En este caso solamente se elimina directament el nodo del árbol binario.

Nodo interior (1 hijo)

El nodo se elimina y se conecta su hijo directamente con el padre del nodo eliminado.

Nodo interior con 2 hijos

Este es el caso más complejo. Existen dos opciones que no se pueden intercambiar:

Luego, se reemplaza el valor del nodo a eliminar con el valor del sucesor o predecesor inorden. Es importante recalcar que el intercambio es a nivel de valores.

Finalmente, se elimina el sucesor o predecesor inorden.

Búsqueda de un valor

La búsqueda es similar a una búsqueda binaria. Inicia por la raíz y se hace la comprobación de si es menor se busca en el subárbol izquierdo y si es mayor por el subárbol derecho.

Si no se ha encontrado el valor y se llega a un nodo hoja, significa que el valor no está disponible.

Implementación

private static class BSTNode<E> {
  private E element; // Value for this node
  private BSTNode<E> left; // Pointer to left child
  private BSTNode<E> right; // Pointer to right child

  // Constructor
  public BSTNode(E it, BSTNode<E> lt, BSTNode<E> rt) {
    element = it; 
    left = lt; 
    right = rt;
  }

  public E value() { return element; }
  public BSTNode<E> left() { return left; }
  public BSTNode<E> right() { return right; }

  private void setValue(E it) { element = it; }
  private void setLeft(BSTNode<E> lt) { left = lt; }
  private void setRight(BSTNode<E> rt) { right = rt; }
}
public class BST<E extends Comparable<E>> {
    private BSTNode<E> root; // Root of the BST
    private int nodecount; // Number of nodes in the BST

    // constructor
    BST() {
        clear();
    }

    // Reinitialize tree
    public void clear() {
        root = null;
        nodecount = 0;
    }

    // Insert a record into the tree.
    // key: The record to insert.
    public void insert(E key) {
        root = inserthelp(root, key);
        nodecount++;
    }

    // Recursive helper method for inserting a node
    private BSTNode<E> inserthelp(BSTNode<E> rt, E e) {
        if (rt == null) {
            return new BSTNode<>(e, null, null);
        }

        if (rt.value().compareTo(e) > 0) {
            rt.setLeft(inserthelp(rt.left(), e));
        } else {
            rt.setRight(inserthelp(rt.right(), e));
        }
        return rt;
    }

    // Remove a record from the tree
    // key: The key value of record to remove
    // Returns the record removed, null if there is none.
    public E remove(E key) {
        E temp = findhelp(root, key); // First find it
        if (temp != null) {
            root = removehelp(root, key); // Now remove it
            nodecount--;
        }
        return temp;
    }

    // Adapted removehelper method
    private BSTNode<E> removehelp(BSTNode<E> rt, E key) {
        if (rt == null) return null;

        int cmp = key.compareTo(rt.value());
        if (cmp < 0) {
            rt.setLeft(removehelp(rt.left(), key));
        } else if (cmp > 0) {
            rt.setRight(removehelp(rt.right(), key));
        } else {
            if (rt.left() == null)
                return rt.right();
            else if (rt.right() == null)
                return rt.left();

            BSTNode<E> succ = findMin(rt.right());
            rt.setValue(succ.value());
            rt.setRight(removeMin(rt.right()));
        }
        return rt;
    }

    // Find the minimum value in the tree
    private BSTNode<E> findMin(BSTNode<E> rt) {
        while (rt.left() != null) rt = rt.left();
        return rt;
    }

    // Remove the minimum node
    private BSTNode<E> removeMin(BSTNode<E> rt) {
        if (rt.left() == null) return rt.right();
        rt.setLeft(removeMin(rt.left()));
        return rt;
    }

    // Return the record with key value k, null if none exists
    // key: The key value to find
    public E find(E key) {
        return findhelp(root, key);
    }

    // Recursive helper to search a value
    private E findhelp(BSTNode<E> rt, E key) {
        if (rt == null) return null;

        if (rt.value().compareTo(key) > 0) {
            return findhelp(rt.left(), key);
        } else if (rt.value().compareTo(key) == 0) {
            return rt.value();
        } else {
            return findhelp(rt.right(), key);
        }
    }

    public int size() {
        return nodecount;
    }
}

Referencias

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *