Hola, estoy teniendo problemas con la funcion borrar en la implementacion de un arbol binario de busqueda.
Código C:
Ver originaltypedef int tipoElem;
typedef struct nodo{
tipoElem info;
struct nodo *izq;
struct nodo *der;
}tNodo;
typedef struct{
tNodo *raiz;
int nElems;
}tABB;
// elimina un elemento “item” de un ABB
tNodo suce_pred(tNodo *nodo){
if (nodo->der == NULL) return *nodo;
else suce_pred(nodo->der);
}
void hijo_unico(tNodo *nodo){
if (nodo->izq == NULL){
nodo->info = nodo->der->info;
nodo->izq = nodo->der->izq;
nodo->der = nodo->der->der;
free((void *) nodo
->der
); }
else{
nodo->info = nodo->izq->info;
nodo->izq = nodo->izq->izq;
nodo->der = nodo->izq->der;
free((void *) nodo
->izq
); }
}
void dos_hijos(tNodo *nodo){
tNodo *aux;
*aux = suce_pred(nodo->izq);
nodo->info = aux->info;
hijo_unico(aux);
}
void removeHelp(tNodo *nodo, tipoElem item){
if (item == nodo->info){
if (nodo->izq == NULL && nodo->der == NULL){
nodo = NULL;
}
else if (nodo->izq != NULL && nodo->der != NULL) dos_hijos(nodo);
else hijo_unico(nodo);
}
else if (item < nodo->info) removeHelp(nodo->izq, item);
else removeHelp(nodo->der, item);
}
void remove_n (tABB *T, tipoElem item){
removeHelp(T->raiz, item);
}
int main(){
tABB A;
int c[7]={10,15,12,17,5,7,2};
int b;
initTree(&A);
for (b=0; b<7; b++){
inserta(&A, c[b]);
}
inOrden(&A);
remove_n(&A, 7);
inOrden(&A);
}
El problema es que no la borra despues de aplicar "remove_n". Pero si dentro de la funcion helpRemove, intento imprimir el valor del nodo que asigne a NULL, se me cae el programa (por razones obvias).
Por lo que supongo, que la funcion me esta eliminando el puntero y lo trata como variable local, por eso efectivamente lo asigne como NULL y se cae al imprimir su valor, pero no lo elimine del arbol "original".
¿En que parte esta el error?
Gracias de antemano
Saludos.