Ejercicio sencillo para representar un Arbol Binario, funciones básicas:
- Crear nuevo árbol
- Insertar hojas
- Destruir Árbol
- Imprimir en (Preorden, Postorden e Inorden)
- Localizar nodos menores a un número, mostrarlos y contarlos.
#include <stdio.h>
#include <stdlib.h>
typedef struct nodo
{
struct nodo *hizqdo;
struct nodo *hdrcho;
int contenido;
} nodo;
typedef struct nodo *arbol;
arbol nuevo_arbol (int contenido);
void destruir_arbol (arbol a);
void insertar_arbol (arbol nuevo, arbol *a);
void encontrar_menores (arbol a, int comparador, int *contador);
void imprimir (arbol a, int modo);
int main (void)
{
int contenidos[] = {1, 20, 43, 12, 45, 21, 75, 26, 16, 74, 74, 36, 24, 2, 29, 97, -1};
int *c = contenidos;
arbol a = NULL;
int contador = 0;
while (*c >= 0) {
arbol nuevo = nuevo_arbol(*c);
insertar_arbol (nuevo, &a);
c++;
}
printf ("\nPreorden:\n");
imprimir(a, 1);
printf ("\nPostorden:\n");
imprimir(a, 2);
printf ("\nInorden:\n");
imprimir(a, 3);
printf ("\nEncontrar menores de 50:\n");
encontrar_menores(a, 50, &contador);
printf ("\nContador: %d", contador);
destruir_arbol(a);
return EXIT_SUCCESS;
}
arbol nuevo_arbol (int contenido)
{
arbol ret;
if ((ret = calloc(1,sizeof(nodo))) == NULL) {
return NULL;
}
ret->contenido = contenido;
return ret;
}
void destruir_arbol (arbol a)
{
if (a == NULL) {
return;
}
destruir_arbol(a->hizqdo);
destruir_arbol(a->hdrcho);
free(a);
}
void insertar_arbol (arbol nuevo, arbol *a)
{
if (*a == NULL) {
*a = nuevo;
return;
}
if (nuevo->contenido < (*a)->contenido) {
insertar_arbol(nuevo, &((*a)->hizqdo));
} else if (nuevo->contenido > (*a)->contenido) {
insertar_arbol(nuevo, &((*a)->hdrcho));
}
}
void encontrar_menores (arbol a, int comparador, int *contador)
{
if (a == NULL) {
return;
}
if (a->contenido < comparador) {
printf ("%d | ", a->contenido);
++(*contador);
}
encontrar_menores (a->hizqdo, comparador, contador);
encontrar_menores (a->hdrcho, comparador, contador);
}
void imprimir (arbol a, int modo)
{
if (a == NULL) {
return;
}
if (modo == 1) { // Preorden
printf ("%d | ", a->contenido);
imprimir(a->hizqdo, 1);
imprimir(a->hdrcho, 1);
} else if (modo == 2){ // Postorden
imprimir(a->hizqdo, 2);
imprimir(a->hdrcho, 2);
printf ("%d | ", a->contenido);
} else if (modo == 3) {// Inorden
imprimir(a->hizqdo, 3);
printf ("%d | ", a->contenido);
imprimir(a->hdrcho, 3);
}
}