Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: LadyWin en 11 Septiembre 2021, 22:49 pm



Título: Arbol binario de busqueda
Publicado por: LadyWin en 11 Septiembre 2021, 22:49 pm
Hola! como andan? Queria consultarles si me pueden ayudar a encontrar el error, no me funciona correctamente, lo mas probable es que este a la hora eliminar me estoy salteando algo y no se que es, desde ya muchas gracias! ;D ;D

A la hora de mostrar el arbol resultante se transforma en un bucle infinito, me empieza a mostrar direcciones de memoria
Código
  1. void eliminar (Arbol * ppio, int x)
  2. { // Busca el elemento que se desea eliminar
  3. if (esVacio(*ppio)) return;
  4. else if (x < (*ppio)->dato)
  5. // Si el valor es menor se recorre por la izquierda
  6. eliminar(&(*ppio)->hizq,x);
  7.  
  8. else if (x > (*ppio)->dato)
  9. // Si el valor es mayor se recorre por la derecha
  10. eliminar(&(*ppio)->hder,x);
  11.  
  12. else
  13. // Si ya encontraste el valor
  14. eliminar_elemento (ppio);
  15.  
  16. }
  17. void eliminar_elemento (Arbol * a)
  18. { // Elimina el elemento que se desea
  19. if (esHoja(*a))
  20. // Si es una hoja
  21. free(*a);
  22.  
  23. else if (esPadreCompleto(*a))
  24. { // Si es padre con dos hijos
  25. Arbol * min = minimo(&(*a)->hder);
  26. (*a)->dato = (*min)->dato;
  27. free(*min);
  28. }
  29. else
  30. // Si tiene solo un hijo
  31. a = reemplazar(a);
  32. }
  33. Arbol * minimo (Arbol * a)
  34. { // Busca el menor elemento
  35. if (esVacio(*a)) return NULL; // Retornas nulo si el arbol esta vacio
  36. if (!esVacio((*a)->hizq))
  37. // Si tiene hijo izquierdo
  38. return minimo(&(*a)->hizq); // Buscamos la parte mas izq posible
  39. else
  40. // Si no tiene hijo izq
  41. return a; // Retornamos el mismo nodo
  42.  
  43. }
  44. Arbol * reemplazar (Arbol * a)
  45. { // Reemplaza los valores padre con hijo
  46. Arbol aux;
  47. if (!esVacio((*a)->hizq))
  48. {
  49. aux = *a;
  50. *a = (*a)->hizq;
  51. free(aux);
  52. } else
  53. {
  54. aux = *a;
  55. (*a) = (*a)->hder;
  56. free(aux);
  57. }
  58. return a;
  59. }