#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
struct arbol{
struct arbol *izq;
int clave;
struct arbol *der;
};
typedef struct arbol ARB;
typedef ARB *ARBP;
void menu()
{
printf("\n\n 1 Inserta un nuevo nodo \n");
printf(" 2 Realizar un recorrido en preorden \n");
printf(" 3 Realizar un recorrido en inorden \n");
printf(" 4 Realizar un recorrido en postorden \n");
printf(" 5 Realizar una busqueda \n\n\n");
}
//INSERTAR NODO
void inserta(ARBP *raiz)
{
ARBP nuevoptr, actual, anterior=NULL;
nuevoptr= (ARBP) malloc(sizeof(ARB));
if(nuevoptr==NULL)
{
printf("No hay espacio suficiente en memoria \n");
}
else
{
nuevoptr->izq=NULL;
printf("\n\tIngrese la clave del nuevo elemento: \t");
scanf("%d", &(nuevoptr->clave));
nuevoptr->der=NULL;
if(*raiz == NULL) // NO HAY NODOS
*raiz = nuevoptr;
else
{
actual = *raiz;
while(actual != NULL)
{
anterior = actual;
if((nuevoptr->clave) == (actual->clave))
{
printf("\n\t No se puede insertar porque la clave esta duplicada");
getch();
break;
}
else
{
if (nuevoptr -> clave < actual -> clave)
{
actual = actual -> izq;
}
else
{
actual = actual -> der;
}
}
}
if((nuevoptr -> clave) < (anterior -> clave))
anterior -> izq = nuevoptr;
else if((nuevoptr-> clave) > (anterior -> clave))
anterior -> der = nuevoptr;
}
}
system("cls");
}
//PREORDEN
void preorden (ARBP aux1)
{
ARBP aux2;
if(aux1!=NULL)
{
printf("\n Raiz = %d", aux1 -> clave);
aux2 = aux1 -> izq;
if(aux2!=NULL)
printf("\tIZQUIERDO: %d", aux2-> clave);
else
printf("\tIZQUIERDO: NULO");
preorden(aux2);
aux2= aux1 -> der;
if(aux2!=NULL)
printf("\tDERECHO: %d", aux2 -> clave);
else
printf("\tDERECHO: NULO");
preorden(aux2);
}
}
//INORDEN
void inorden (ARBP aux1)
{
ARBP aux2;
if(aux1!=NULL)
{
aux2 = aux1 -> izq;
if(aux2!=NULL)
printf("\tIZQUIERDO: %d", aux2-> clave);
else
printf("\tIZQUIERDO: NULO");
inorden(aux2);
printf("\n Raiz = %d", aux1 -> clave);
aux2= aux1 -> der;
if(aux2!=NULL)
printf("\tDERECHO: %d", aux2 -> clave);
else
printf("\tDERECHO: NULO");
inorden(aux2);
}
}
//POSTORDEN
void postorden (ARBP aux1)
{
ARBP aux2;
if(aux1!=NULL)
{
aux2 = aux1 -> izq;
if(aux2!=NULL)
printf("\tIZQUIERDO: %d", aux2-> clave);
else
printf("\tIZQUIERDO: NULO");
postorden(aux2);
aux2= aux1 -> der;
if(aux2!=NULL)
printf("\tDERECHO: %d", aux2 -> clave);
else
printf("\tDERECHO: NULO");
postorden(aux2);
printf("\n Raiz = %d", aux1 -> clave);
}
}
//BUSCAR NODO
void busqueda(ARBP raiz)
{
int clave_busq;
printf("\n Ingresa la clave del elemento a buscar: \t");
scanf("%d",&clave_busq);
while (raiz != NULL)
{
if((raiz -> clave) == clave_busq)
{
printf("\nClave %d encontrada\n", raiz->clave);
break;
}
else
{
if((clave_busq) < (raiz -> clave))
{
printf("\n La clave es menor entonces nos vamos por la izquierda de %d\n", raiz->clave);
raiz = raiz -> izq;
}
else
{
if((clave_busq) > (raiz -> clave))
{
printf("\nLa clave es mayor entonces nos vamos por la derecha de %d\n", raiz->clave);
raiz = raiz -> der;
}
}
}
}
}
//PRINCIPAL
main()
{
ARBP raiz = NULL;
int opcion;
while(opcion!=6)
{
menu();
printf("\n Elige la opcion: ");
scanf("%d", &opcion);
switch(opcion)
{
case 1: inserta(&raiz);
break;
case 2: preorden(raiz);
getch();
system("cls");
break;
case 3: inorden(raiz);
getch();
system("cls");
break;
case 4: postorden(raiz);
getch();
system("cls");
break;
case 5: busqueda(raiz);
getch();
system("cls");
break;
case 6:
break;
default: printf("\n\n\t\tOpcion invalida.");
getch();
system("cls");
break;
}
}
system("pause");
}
No hay comentarios:
Publicar un comentario