Arbol binario de busqueda

Iniciado por LadyWin, 11 Septiembre 2021, 22:49 PM

0 Miembros y 1 Visitante están viendo este tema.

LadyWin

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
void eliminar (Arbol * ppio, int x)
{ // Busca el elemento que se desea eliminar
if (esVacio(*ppio)) return;
else if (x < (*ppio)->dato)
// Si el valor es menor se recorre por la izquierda
eliminar(&(*ppio)->hizq,x);

else if (x > (*ppio)->dato)
// Si el valor es mayor se recorre por la derecha
eliminar(&(*ppio)->hder,x);

else
// Si ya encontraste el valor
eliminar_elemento (ppio);

}
void eliminar_elemento (Arbol * a)
{ // Elimina el elemento que se desea
if (esHoja(*a))
// Si es una hoja
free(*a);

else if (esPadreCompleto(*a))
{ // Si es padre con dos hijos
Arbol * min = minimo(&(*a)->hder);
(*a)->dato = (*min)->dato;
free(*min);
}
else
// Si tiene solo un hijo
a = reemplazar(a);
}
Arbol * minimo (Arbol * a)
{ // Busca el menor elemento
if (esVacio(*a)) return NULL; // Retornas nulo si el arbol esta vacio
if (!esVacio((*a)->hizq))
// Si tiene hijo izquierdo
return minimo(&(*a)->hizq); // Buscamos la parte mas izq posible
else
// Si no tiene hijo izq
return a; // Retornamos el mismo nodo

}
Arbol * reemplazar (Arbol * a)
{ // Reemplaza los valores padre con hijo
Arbol aux;
if (!esVacio((*a)->hizq))
{
aux = *a;
*a = (*a)->hizq;
free(aux);
} else
{
aux = *a;
(*a) = (*a)->hder;
free(aux);
}
return a;
}