Publicado en Tema 8 • Colecciones

Ejercicio 8: TreeSet

Enunciado

En este ejercicio practicaremos con la implementación TreeSet. A diferencia de HashSet (que usa una tabla hash) o LinkedHashSet (que usa una lista enlazada), el TreeSet utiliza una estructura de árbol binario de búsqueda (específicamente un árbol Rojo-Negro).

Requisitos:

  • Crear un conjunto que implemente un árbol binario.
  • Añadir números enteros en desorden y comprobar cómo se recuperan ordenados.
  • Realizar la misma operación con cadenas de texto (nombres de alumnos) para observar el orden alfabético.

Solución

La clave de TreeSet es que garantiza que los elementos estarán ordenados de forma ascendente según su orden natural (numérico para enteros y lexicográfico para Strings).

package Tema8.Ejercicios.ejercicio8;

import java.util.Set;
import java.util.TreeSet;

public class Ejercicio8 {
    public static void main(String[] args) {

        // 1. Creamos el TreeSet para números enteros
        // Esta implementación ordena los elementos automáticamente
        Set<Integer> numeros = new TreeSet<>();
        
        // Añadimos números en orden aleatorio
        numeros.add(50);
        numeros.add(10);
        numeros.add(30);

        // Recorrer e imprimir: saldrán como 10, 30, 50
        System.out.println("Números ordenados automáticamente por el árbol:");
        for (Integer n : numeros) {
            System.out.println("- " + n);
        }

        // 2. Repetimos el proceso con nombres de alumnos (Strings)
        Set<String> alumnos = new TreeSet<>();
        alumnos.add("Zaira");
        alumnos.add("Ana");
        alumnos.add("Luis");

        // El orden natural de String es el alfabético
        System.out.println("\nAlumnos ordenados alfabéticamente:");
        for (String nombre : alumnos) {
            System.out.println("- " + nombre);
        }
    }
}

Conclusión

¿Cómo funciona el orden?
TreeSet requiere que los objetos almacenados implementen la interfaz Comparable. Como Integer y String ya la implementan, el conjunto sabe cómo compararlos para decidir su posición en el árbol.

Ventajas y desventajas:
La ventaja principal es tener los datos siempre ordenados. La desventaja es que las operaciones de inserción y borrado son ligeramente más lentas (log(n)) que en un HashSet (O(1)), ya que el árbol debe reequilibrarse tras cada cambio.