BSTs en C (parte 2)

Continuamos viendo cómo desarrollar un árbol de búsqueda binario en C, ahora viendo cómo implementar las operaciones de recorrido preorden, inorden y postorden. Cuidado con los números.

Cuando trabajamos con árboles binarios de búsqueda en C, una de las tareas fundamentales es poder imprimir su contenido de manera que refleje su estructura y facilite su comprensión. Para ello, podemos aprovechar los recorridos clásicos: preorden, inorden y postorden, que nos permiten procesar los nodos del árbol siguiendo diferentes órdenes.

Empezamos por el recorrido en preorden. La idea es sencilla: primero procesamos la raíz, luego el subárbol izquierdo y finalmente el subárbol derecho. Para implementarlo, definimos una función recursiva que primero verifica si el árbol está vacío, que será nuestro caso base. Si no lo está, imprimimos el valor del nodo actual, y luego llamamos recursivamente a la función para el hijo izquierdo y después para el derecho. Para visualizar mejor la estructura, podemos imprimir un guion - cuando encontramos un árbol vacío y encerrar cada llamada en paréntesis, lo que nos ayuda a distinguir claramente cada subárbol.

void preorden(Arbol* arbol) {
    if (arbol == NULL) {
        printf("-");
        return;
    }
    printf("(");
    printf("%d", arbol->valor);
    preorden(arbol->izquierdo);
    preorden(arbol->derecho);
    printf(")");
}

Al insertar elementos como 5, 10, 4, 9 y 15, y luego imprimir el árbol con esta función, veremos cómo se refleja la estructura: el 5 aparece primero porque es la raíz, el 10 se sitúa en el hijo derecho, el 4 en el izquierdo, y así sucesivamente. Aunque la impresión no incluye guiones o espacios adicionales para separar los valores, la representación con paréntesis y guiones nos permite entender la organización recursiva del árbol.

El recorrido en inorden cambia el orden en que procesamos los nodos: primero recorremos el subárbol izquierdo, luego imprimimos la raíz y finalmente recorremos el subárbol derecho. Esto nos da una impresión ordenada de los valores en un árbol binario de búsqueda, ya que los valores se muestran en orden ascendente. La función también es recursiva y sigue el mismo patrón de caso base para árboles vacíos.

void inorden(Arbol* arbol) {
    if (arbol == NULL) {
        printf("-");
        return;
    }
    printf("(");
    inorden(arbol->izquierdo);
    printf("%d", arbol->valor);
    inorden(arbol->derecho);
    printf(")");
}

Al imprimir el árbol con esta función, los paréntesis nos ayudan a distinguir cada subárbol, y podemos ver claramente cómo los valores se ordenan de menor a mayor, reflejando la propiedad fundamental del árbol binario de búsqueda.

Finalmente, el recorrido en postorden procesa primero el subárbol izquierdo, luego el derecho y, por último, la raíz. La función sigue la misma estructura recursiva, con el caso base para árboles vacíos y la impresión de paréntesis para delimitar cada subárbol.

void postorden(Arbol* arbol) {
    if (arbol == NULL) {
        printf("-");
        return;
    }
    printf("(");
    postorden(arbol->izquierdo);
    postorden(arbol->derecho);
    printf("%d", arbol->valor);
    printf(")");
}

Esta forma de imprimir nos muestra cómo se recorren primero los hijos antes de procesar el nodo padre, lo que puede ser útil para ciertas operaciones como la eliminación de nodos o la evaluación de expresiones en árboles.

En todos estos casos, la clave está en entender la recursividad y cómo el orden en que procesamos la raíz y los hijos cambia el resultado final. Además, la representación con paréntesis y guiones facilita la visualización de la estructura del árbol, permitiéndonos distinguir claramente cada subárbol y su posición relativa.

Aunque por ahora nos hemos centrado en imprimir el árbol, en futuras ocasiones podemos explorar cómo procesar los nodos para realizar otras operaciones, como reconstruir el árbol a partir de su representación o eliminar elementos, que también son aspectos fundamentales en el manejo de árboles binarios de búsqueda en C.

Lista de reproducción
  1. 1
    Qué son las estructuras de datos
    3 minutos
  2. 2
    Listas enlazadas: Teoría
    12 minutos
  3. 3
    Listas enlazadas en C
    18 minutos
  4. 4
    Listas enlazadas en Java
    17 minutos
  5. 5
    Colas: teoría
    6 minutos
  6. 6
    Colas en C
    12 minutos
  7. 7
    Colas en Java
    10 minutos
  8. 8
    Pilas: teoría
    7 minutos
  9. 9
    Pilas en C
    11 minutos
  10. 10
    Pilas en Java
    10 minutos
  11. 11
    Introducción a los árboles
    11 minutos
  12. 12
    Árboles binarios
    9 minutos
  13. 13
    Árboles binarios de búsqueda (parte 1)
    10 minutos
  14. 14
    Árboles de búsqueda binaria (parte 2)
    8 minutos
  15. 15
    BSTs en C (parte 1)
    13 minutos
  16. 16
    BSTs en C (parte 2)
    8 minutos
  17. 17
    BSTs en C (y parte 3)
    18 minutos
  18. 18
    BSTs en Java (parte 1)
    9 minutos
  19. 19
    BSTs en Java (parte 2)
    11 minutos
  20. 20
    BSTs en Java (parte 3)
    10 minutos
  21. 21
    Árbol desde preorden e inorden
    8 minutos
  22. 22
    Árbol desde inorden y postorden
    8 minutos
  23. 23
    Árboles k-arios
    6 minutos
  24. 24
    Árboles B (parte 1)
    11 minutos
  25. 25
    Árboles B (parte 2)
    20 minutos
  26. 26
    Árboles B (parte 3)
    39 minutos