para el 4.4 me hice un procedimiento recursivo, lo llame borrarRec, y arranca con un if( a != NULL) y todo lo demas esta adentro, entonces si es NULL no hace nada, queria saber si eso era correcto. en la funcion borrar directamente puse la condicion que debia cumpliar y si las cumplia invocaba el procedimiento borrarRec(AG a&, int x)
para el 4.5 fue un poco mas complicado, hice otro procedimiento llamado eliminarArbol(AG a&, int x) que elimina hoja por hoja el arbol y termina por eliminar la raiz y dejando el puntero apuntando a NULL.
el problema mas grande fue hallar el x para borrarsub, ya que a diferencia de borrar debia de evaluar si este tenia hijo y borrar todo el hijo. para eso use la funcion del video 4, buscar, e hice una funcion mas llamada anterior, que me da el puntero anterior a uno que pertenezca al arbol y es de la siguiente manera.
AG anterior(AG a, AG b)
{
if (a == NULL)
return NULL;
else if(a->sH == b || a->Ph == b)
return a;
else
{
AG Bhijos = anterior(a->ph, b);
AG Bhermanos = anterior(a->sH, b);
if (Bhijos != NULL)
return Bhijos;
else
return Bhermanos;
}
}
luego dentro de borrarsub tome el siguiente if
AG aux = buscar(x, a);
AG aux2 = anterior(a, aux);
if (aux2->pH == aux)
{
aux2->pH = aux->sH;
aux->sH = NULL;
eliminarArbol(aux);
}
else
{
aux2->sH = aux->sH;
aux->sH = NULL;
eliminarArbol(aux);
}
al final de todo esto retorno el parametro que me dieron que es a, ya que el puntero inicial no se puede ver alterado por letra,
mi duda es respecto a la funcion anterior, si es buena practica o se debia de hacer de otra manera.