david_gimenez

EDA Lab #11

Nov 8th, 2025
384
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.00 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct Nodo {
  5.     int dato;
  6.     struct Nodo *izq;
  7.     struct Nodo *der;
  8. } Nodo;
  9.  
  10. Nodo* crearNodo(int valor) {
  11.     Nodo *nuevo = (Nodo*)malloc(sizeof(Nodo));
  12.     nuevo->dato = valor;
  13.     nuevo->izq = NULL;
  14.     nuevo->der = NULL;
  15.     return nuevo;
  16. }
  17.  
  18. Nodo* insertarConMensaje(Nodo *raiz, int valor, int esPrimerNodo) {
  19.     if (raiz == NULL) {
  20.         if (esPrimerNodo) {
  21.             printf("Ingresa %d al arbol. Su padre es NULL.\n", valor);
  22.         }
  23.         return crearNodo(valor);
  24.     }
  25.    
  26.     if (valor < raiz->dato) {
  27.         if (raiz->izq == NULL) {
  28.             printf("Ingresa %d al arbol. Su padre es el %d. Es su hijo izquierdo.\n", valor, raiz->dato);
  29.         }
  30.         raiz->izq = insertarConMensaje(raiz->izq, valor, 0);
  31.     } else if (valor > raiz->dato) {
  32.         if (raiz->der == NULL) {
  33.             printf("Ingresa %d al arbol. Su padre es el %d. Es su hijo derecho.\n", valor, raiz->dato);
  34.         }
  35.         raiz->der = insertarConMensaje(raiz->der, valor, 0);
  36.     }
  37.    
  38.     return raiz;
  39. }
  40.  
  41. Nodo* insertar(Nodo *raiz, int valor) {
  42.     int esPrimero;
  43.     if (raiz == NULL) {
  44.         esPrimero = 1;
  45.     } else {
  46.         esPrimero = 0;
  47.     }
  48.     return insertarConMensaje(raiz, valor, esPrimero);
  49. }
  50.  
  51. void imprimirArbolAux(Nodo *raiz, int espacio) {
  52.     int i;
  53.     if (raiz == NULL) {
  54.         return;
  55.     }
  56.    
  57.     espacio += 5;
  58.     imprimirArbolAux(raiz->der, espacio);
  59.    
  60.     printf("\n");
  61.     for (i = 5; i < espacio; i++) {
  62.         printf(" ");
  63.     }
  64.     printf("%d\n", raiz->dato);
  65.    
  66.     imprimirArbolAux(raiz->izq, espacio);
  67. }
  68.  
  69. void verArbol(Nodo *raiz) {
  70.     if (raiz == NULL) {
  71.         printf("El arbol esta vacio.\n");
  72.         return;
  73.     }
  74.     printf("\nEstructura del Arbol:\n");
  75.     imprimirArbolAux(raiz, 0);
  76.     printf("\n");
  77. }
  78.  
  79. void inOrden(Nodo *raiz, int *vector, int *index) {
  80.     if (raiz != NULL) {
  81.         inOrden(raiz->izq, vector, index);
  82.         vector[(*index)++] = raiz->dato;
  83.         inOrden(raiz->der, vector, index);
  84.     }
  85. }
  86.  
  87. void ordenarVector(Nodo *raiz, int *vector, int tam) {
  88.     int index = 0;
  89.     inOrden(raiz, vector, &index);
  90. }
  91.  
  92. void imprimirVector(int *vector, int tam) {
  93.     int i;
  94.     printf("Vector: [ ");
  95.     for (i = 0; i < tam; i++) {
  96.         printf("%d ", vector[i]);
  97.     }
  98.     printf("]\n");
  99. }
  100.  
  101. void espejoArbol(Nodo *raiz) {
  102.     Nodo *temp;
  103.     if (raiz == NULL) {
  104.         return;
  105.     }
  106.    
  107.     temp = raiz->izq;
  108.     raiz->izq = raiz->der;
  109.     raiz->der = temp;
  110.    
  111.     espejoArbol(raiz->izq);
  112.     espejoArbol(raiz->der);
  113. }
  114.  
  115. void liberarArbol(Nodo *raiz) {
  116.     if (raiz != NULL) {
  117.         liberarArbol(raiz->izq);
  118.         liberarArbol(raiz->der);
  119.         free(raiz);
  120.     }
  121. }
  122.  
  123. int main() {
  124.     Nodo *raiz = NULL;
  125.     int opcion, tam, i;
  126.     int *vector = NULL;
  127.     int arbolCreado = 0;
  128.    
  129.     printf("=== ARBOL BINARIO DE BUSQUEDA ===\n\n");
  130.    
  131.     do {
  132.         printf("\n--- MENU ---\n");
  133.         printf("1. Insertar elementos desde vector\n");
  134.         printf("2. Ver Arbol\n");
  135.         printf("3. Ordenar vector\n");
  136.         printf("4. Imprimir Vector\n");
  137.         printf("5. Espejo del Arbol\n");
  138.         printf("6. Salir\n");
  139.         printf("Opcion: ");
  140.        
  141.         if (scanf("%d", &opcion) != 1) {
  142.             while(getchar() != '\n');
  143.             printf("Error: Ingrese solo numeros.\n");
  144.             continue;
  145.         }
  146.        
  147.         switch(opcion) {
  148.             case 1:
  149.                 if (arbolCreado) {
  150.                     printf("El arbol ya fue creado. Liberando arbol anterior...\n");
  151.                     liberarArbol(raiz);
  152.                     free(vector);
  153.                     raiz = NULL;
  154.                 }
  155.                
  156.                 printf("Ingrese la cantidad de elementos: ");
  157.                 scanf("%d", &tam);
  158.                
  159.                 vector = (int*)malloc(tam * sizeof(int));
  160.                
  161.                 printf("Ingrese los %d elementos:\n", tam);
  162.                 for (i = 0; i < tam; i++) {
  163.                     printf("Elemento %d: ", i + 1);
  164.                     scanf("%d", &vector[i]);
  165.                     raiz = insertar(raiz, vector[i]);
  166.                 }
  167.                
  168.                 arbolCreado = 1;
  169.                 printf("\nArbol creado exitosamente!\n");
  170.                 imprimirVector(vector, tam);
  171.                 break;
  172.                
  173.             case 2:
  174.                 if (!arbolCreado) {
  175.                     printf("Primero debe crear el arbol (opcion 1).\n");
  176.                 } else {
  177.                     verArbol(raiz);
  178.                 }
  179.                 break;
  180.                
  181.             case 3:
  182.                 if (!arbolCreado) {
  183.                     printf("Primero debe crear el arbol (opcion 1).\n");
  184.                 } else {
  185.                     ordenarVector(raiz, vector, tam);
  186.                     printf("\nVector ordenado exitosamente!\n");
  187.                 }
  188.                 break;
  189.                
  190.             case 4:
  191.                 if (!arbolCreado) {
  192.                     printf("Primero debe crear el arbol (opcion 1).\n");
  193.                 } else {
  194.                     imprimirVector(vector, tam);
  195.                 }
  196.                 break;
  197.                
  198.             case 5:
  199.                 if (!arbolCreado) {
  200.                     printf("Primero debe crear el arbol (opcion 1).\n");
  201.                 } else {
  202.                     espejoArbol(raiz);
  203.                     printf("\nEspejo del arbol creado exitosamente!\n");
  204.                     verArbol(raiz);
  205.                 }
  206.                 break;
  207.                
  208.             case 6:
  209.                 printf("\nSaliendo del programa...\n");
  210.                 if (arbolCreado) {
  211.                     liberarArbol(raiz);
  212.                     free(vector);
  213.                 }
  214.                 break;
  215.                
  216.             default:
  217.                 printf("Opcion invalida. Intente de nuevo.\n");
  218.         }
  219.        
  220.     } while(opcion != 6);
  221.    
  222.     return 0;
  223. }
Advertisement
Add Comment
Please, Sign In to add comment