martes, 26 de noviembre de 2013

Programa 8: Árbol. Fernando Mtz R

#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