¿Cómo Crear un Arbol Binario de Búsqueda en C? - How to create a binary search tree in C?

#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;

    

}


 


Publicar un comentario

0 Comentarios