#include <stdio.h> //Entrada y Salida de Datos
#include <stdlib.h> //Para Memoria Dinamica
typedef struct Nodo{ //Nodo es el nombre de la estructura
int numero;
struct Nodo *izq; //Como el siguiente
struct Nodo *der;
}miArbol; //Nodo es el tipo de dato para declarar la estructura
void insertarArbol(miArbol **arbol, int numero){ //Procedimento para Insertar Nodos a un ABB
miArbol *nuevoNodo; //Creamos un nueva nodo,
int raiz;
//Creamos un Nuevo Nodo(aqui esta en el aire, no esta apuntando ni apuntado, ese nuevoNodo)
nuevoNodo = (miArbol *) malloc(sizeof(miArbol));
nuevoNodo -> numero = numero;
nuevoNodo -> der = nuevoNodo -> izq = NULL;
//Dos apuntadores
//Propiamente ya le insertamos
if (*arbol==NULL){ //Si el arbol le tenemos vacia o !(*arbol)
*arbol = nuevoNodo;
} else{
raiz = (*arbol) -> numero; //Ahora raiz tiene el valor del unico dato ingresado que estaba en arbol. Despues sera el valor de un padre por ej
if(numero < raiz){
insertarArbol(&(*arbol) ->izq , numero);//Se conectara el nuevoNodo a la izq de lo que tenga arbol
}else{
insertarArbol(&(*arbol) ->der , numero); //Se conectara el nuevoNodo a la der de lo que tenga arbol
//insertarArbol(&(*nuevoNodo).der, numero);
}
}
}
void preorden(miArbol **arbol) { //Procedimiento para Mostrar un Arbol por Preorden RID
if (*arbol != NULL) {
printf(" %d", (*arbol)->numero); //Raiz
preorden(&(*arbol)->izq); //Izquierda
preorden(&(*arbol)->der); //Derecha
}
}
void inorden(miArbol **arbol) {
if (*arbol != NULL) {
inorden(&(*arbol)->izq);
printf("%d,", (*arbol)->numero);
inorden(&(*arbol)->der);
}
}
void postorden(miArbol **arbol) {
if (*arbol != NULL) {
postorden(&(*arbol)->izq);
postorden(&(*arbol)->der);
printf("%d,", (*arbol)->numero);
}
}
void liberarArbol(miArbol **arbol) { //Procedimiento para eliminar/liberar memoeira cada elemento de un arbol
if (*arbol == NULL) { // if (*arbol == NULL) {
free(*arbol);
return;
} //Va elminnado padres padres. R
if ((*arbol)->izq != NULL) { // Comienza eliminando por la izquierda
liberarArbol(&(*arbol)->izq);
}else if((*arbol)->der != NULL){ //Termina por la izquierda va ahora por la derecha
liberarArbol(&(*arbol)->der);
}
}
int main(int argc, const char * argv[]) {
int numero;
int n;
miArbol *arbol = NULL; //Cuando se genere el arbol, esta estara siempre vacia
// printf(" ¿Cuántos Numeros Desea Ingresar?: ");
// scanf("%d",&n); //Total de Numeros
//MENU
int opcion;
do{
printf( "\n 1. Ingresar Elementos al Arbol");
printf( "\n 2. Mostrar Elementos del Arbol usando Preorden");
printf( "\n 3. Mostrar Elementos del Arbol usando Inorden");
printf( "\n 4. Mostrar Elementos del Arbol usando Postorden");
printf( "\n 5. Salir");
printf( "\n Introduzca una Opción (1-5): ");
scanf("%d", &opcion);
switch (opcion)
{
case 1:
// printf(" Ingrese los Numeros: ");
// for( int i = 0; i < n ; i++){
printf(" Ingrese el Numero: ");
scanf("%d",&numero); //Datos a Ingresar
insertarArbol (&arbol, numero);
// }
break;
case 2:
printf(" Arbol Preorden: \n");
preorden(&arbol);
break;
case 3:
printf(" Arbol Inorden: \n ");
inorden(&arbol); //O liberar memoria
break;
case 4:
printf(" Arbol Postorden: \n ");
postorden(&arbol); //O liberar memoria
break;
}
}while(opcion != 5);
printf(" El Programa ha Terminado Satisfactoriamente \n ");
liberarArbol(&arbol); //O liberar memoria
return 0;
}
0 Comentarios