Árbol binario. - Universidad Tecnológica de la Mixteca

Anuncio
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
Descargar