APUNTES DE ESTRUCTURA DE DATOS ________________________________________________________________________________________ //============================================================================== //============================================================================== // PROGRAMA : p45_arbol_binario.cpp // FUNCION : Programa que implementa un árbol binario. // REALIZADO POR : Prof. Juan Juárez Fuentes (basado en el libro de Deitel) // COMPILADOR EN EL QUE SE EJECUTO: DEV-C // FECHA : 02-06-2010 //============================================================================== //============================================================================== // LIBRERIAS //============================================================================== //============================================================================== #include <stdio.h> #include <stdlib.h> #include <time.h> //============================================================================== //============================================================================== // ESTRUCTURAS //============================================================================== //============================================================================== // estructura autorreferenciada struct PLANTILLA_Nodo_de_Arbol { struct PLANTILLA_Nodo_de_Arbol *Apuntador_izquierdo; int dato; struct PLANTILLA_Nodo_de_Arbol *Apuntador_derecho; }; //============================================================================== typedef struct PLANTILLA_Nodo_de_Arbol SINONIMO_PLANTILLA_NODO_DE_ARBOL; //Sinónimo de la estructura PLANTILLA_Nodo_de_Arbol typedef SINONIMO_PLANTILLA_NODO_DE_ARBOL *APUNTADOR_NODO_DE_ARBOL; //Sinónimo de SINONIMO_PLANTILLA_NODO_DE_ARBOL //============================================================================== //============================================================================== // PROTOTIPO DE FUNCIONES //============================================================================== //============================================================================== void insertar_nodo_en_Arbol(APUNTADOR_NODO_DE_ARBOL *, int); void recorrido_enorden(APUNTADOR_NODO_DE_ARBOL); void recorrido_preorden(APUNTADOR_NODO_DE_ARBOL); void recorrido_postorden(APUNTADOR_NODO_DE_ARBOL); void inserta_aleatoriamente(APUNTADOR_NODO_DE_ARBOL *); void menu(void); 117 Prof. Juan Juárez Fuentes APUNTES DE ESTRUCTURA DE DATOS ________________________________________________________________________________________ void encabezado(void); void fin(void); //============================================================================== //============================================================================== // PRINCIPAL //============================================================================== //============================================================================== int main(void) { APUNTADOR_NODO_DE_ARBOL Apuntador_a_raiz = NULL; // apuntador al nodo raiz. int eleccion; int valor_leido; encabezado(); menu(); printf("\n\n Opcion del menu: "); scanf("%d", & eleccion); while(eleccion != 6) { switch(eleccion) { case 1: // pone valor en la lista printf("\n Dar un entero: "); scanf("%d", & valor_leido); insertar_nodo_en_Arbol(& Apuntador_a_raiz, valor_leido); break; case 2: //Llenado aleatorio de 10 elementos inserta_aleatoriamente(& Apuntador_a_raiz); printf("\n"); break; case 3: //Recorrido del árbol en preorden printf("\n\n El recorrido en preorden es: "); recorrido_preorden(Apuntador_a_raiz); printf("\n"); break; case 4: //Recorrido del árbol en enorden printf("\n\n El recorrido en enorden es: "); recorrido_enorden(Apuntador_a_raiz); printf("\n"); break; case 5: //Recorrido del árbol en postorden 118 Prof. Juan Juárez Fuentes APUNTES DE ESTRUCTURA DE DATOS ________________________________________________________________________________________ printf("\n\n El recorrido en postorden es: "); recorrido_postorden(Apuntador_a_raiz); printf("\n"); break; default: printf("Seleccion invalida.\n\n"); menu(); break; } printf("\n Opcion del menu: "); scanf("%d", & eleccion); } printf("\n\n\t Fin de la corrida.\n"); fin(); system("PAUSE"); return 0; } //============================================================================== //============================================================================== // FUNCIONES BASICAS DE LA ESTRUCTURA ÁRBOL //============================================================================== //============================================================================== //--------------------------------------------------------------------------// Insertar un nodo en el Arbol void insertar_nodo_en_Arbol(APUNTADOR_NODO_DE_ARBOL *Apuntador_al_Arbol, int valor_leido) { if(*Apuntador_al_Arbol == NULL) { //La línea siguiente se modifico PLANTILLA_Nodo_de_Arbol en sizeof para que funcionara correctamente. *Apuntador_al_Arbol = (struct PLANTILLA_Nodo_de_Arbol *) malloc(sizeof(PLANTILLA_Nodo_de_Arbol)); if(*Apuntador_al_Arbol != NULL) { (*Apuntador_al_Arbol) -> dato = valor_leido; (*Apuntador_al_Arbol) -> Apuntador_izquierdo = NULL; (*Apuntador_al_Arbol) -> Apuntador_derecho = NULL; } else { printf("No isertado, No hay memoria disponible.\n", valor_leido); exit(1); 119 Prof. Juan Juárez Fuentes APUNTES DE ESTRUCTURA DE DATOS ________________________________________________________________________________________ } else { } if(valor_leido < (*Apuntador_al_Arbol) -> dato) { insertar_nodo_en_Arbol(&((*Apuntador_al_Arbol) -> Apuntador_izquierdo), valor_leido); } else { if(valor_leido > (*Apuntador_al_Arbol) -> dato) { insertar_nodo_en_Arbol(&((*Apuntador_al_Arbol) -> Apuntador_derecho), valor_leido); } else { printf(" dup "); } } } } //--------------------------------------------------------------------------//--------------------------------------------------------------------------//Llenado automático (aleatoriamente) void inserta_aleatoriamente(APUNTADOR_NODO_DE_ARBOL *Apuntador_al_Arbol) { int contador; int numero; //Inserta en el árbol 10 valores aleatorios entre 0 y 14 printf("\n Los numeros puestos en el arbol son: "); for(contador = 1; contador <= 10; contador++) { numero = rand() % 25; printf(" %d ", numero); insertar_nodo_en_Arbol(& (*Apuntador_al_Arbol), numero); } } //--------------------------------------------------------------------------//--------------------------------------------------------------------------//Recorrido enorden 120 Prof. Juan Juárez Fuentes APUNTES DE ESTRUCTURA DE DATOS ________________________________________________________________________________________ void recorrido_enorden(APUNTADOR_NODO_DE_ARBOL Apuntador_al_Arbol) { if(Apuntador_al_Arbol != NULL) { recorrido_enorden(Apuntador_al_Arbol -> Apuntador_izquierdo); printf(" %d ", Apuntador_al_Arbol -> dato); recorrido_enorden(Apuntador_al_Arbol -> Apuntador_derecho); } } //--------------------------------------------------------------------------//--------------------------------------------------------------------------//Recorrido en preorden void recorrido_preorden(APUNTADOR_NODO_DE_ARBOL Apuntador_al_Arbol) { if(Apuntador_al_Arbol != NULL) { printf(" %d ", Apuntador_al_Arbol -> dato); recorrido_preorden(Apuntador_al_Arbol -> Apuntador_izquierdo); recorrido_preorden(Apuntador_al_Arbol -> Apuntador_derecho); } } //--------------------------------------------------------------------------//--------------------------------------------------------------------------//Recorrido en postorden void recorrido_postorden(APUNTADOR_NODO_DE_ARBOL Apuntador_al_Arbol) { if(Apuntador_al_Arbol != NULL) { recorrido_postorden(Apuntador_al_Arbol -> Apuntador_izquierdo); recorrido_postorden(Apuntador_al_Arbol -> Apuntador_derecho); printf(" %d ", Apuntador_al_Arbol -> dato); } } //--------------------------------------------------------------------------//============================================================================== // FUNCIONES COMPLEMENTARIAS DEL PROGRAMA //============================================================================== //--------------------------------------------------------------------------// Imprimir las instrucciones void menu(void) 121 Prof. Juan Juárez Fuentes APUNTES DE ESTRUCTURA DE DATOS ________________________________________________________________________________________ { printf("\t\t\t Dar la eleccion:\n\n"); printf("\t\t 1 Llenado manual (Inserta nodo por nodo en el árbol)\n"); printf("\t\t 2 Llenado Automatico (Inserta valores aleatoriamente)\n"); printf("\t\t 3 Recorrido preorden\n"); printf("\t\t 4 Recorrido rnorden\n"); printf("\t\t 5 Recorrido postorden\n"); printf("\t\t 6 Finalizar el programa\n"); } //--------------------------------------------------------------------------//--------------------------------------------------------------------------void encabezado() { printf("\n\n==========================================================================="); printf("\n\t PROGRAMA QUE IMPLEMENTA UN ARBOL BINARIO\n"); printf("===========================================================================\n\n\n"); } //--------------------------------------------------------------------------//--------------------------------------------------------------------------void fin() { printf("\n\n==========================================================================="); printf("\nESTRUCTURA DE DATOS\t\t\t\tProf.: JUAN JUAREZ FUENTES\n"); printf("UNIVERSIDAD TECNOLOGICA DE LA MIXTECA\n"); printf("===========================================================================\n\n\n"); } //--------------------------------------------------------------------------//============================================================================== //============================================================================== //============================================================================== //============================================================================== /* EJEMPLO DE CORRIDA DEL PROGRAMA Y REALIZACION DEL ARBOL. (EL DIAGRAMA DEL ARBOL ES MANUAL, NO LO HACE EL PROGRAMA) SERIE ORIGINAL: 16 17 9 0 19 24 3 8 12 14 ARBOL: 16 122 Prof. Juan Juárez Fuentes APUNTES DE ESTRUCTURA DE DATOS ________________________________________________________________________________________ 9 0 - 12 - 14 3 - - 17 - 19 24 8 RECORRIDOS: PRE: 16 9 0 3 8 12 14 17 19 24 IN: 0 3 8 9 12 14 16 17 19 24 POST: 8 3 0 14 12 9 24 19 17 16 */ //============================================================================== //============================================================================== //============================================================================== //============================================================================== 123 Prof. Juan Juárez Fuentes