Ver Mensaje Individual
  #1 (permalink)  
Antiguo 18/05/2013, 03:51
AlanFC
 
Fecha de Ingreso: septiembre-2011
Mensajes: 42
Antigüedad: 13 años, 2 meses
Puntos: 3
Funcion borrar en ABB

Hola, estoy teniendo problemas con la funcion borrar en la implementacion de un arbol binario de busqueda.

Código C:
Ver original
  1. typedef int tipoElem;
  2.  
  3. typedef struct nodo{
  4.         tipoElem info;
  5.         struct nodo *izq;
  6.         struct nodo *der;
  7. }tNodo;
  8.  
  9. typedef struct{
  10.         tNodo *raiz;
  11.         int nElems;
  12. }tABB;
  13.  
  14. // elimina un elemento “item” de un ABB
  15. tNodo suce_pred(tNodo *nodo){
  16.       if (nodo->der == NULL) return *nodo;
  17.       else suce_pred(nodo->der);
  18. }
  19. void hijo_unico(tNodo *nodo){
  20.      if (nodo->izq == NULL){
  21.                    nodo->info = nodo->der->info;
  22.                    nodo->izq = nodo->der->izq;
  23.                    nodo->der = nodo->der->der;
  24.                    free((void *) nodo->der);
  25.      }
  26.      else{
  27.           nodo->info = nodo->izq->info;
  28.           nodo->izq = nodo->izq->izq;
  29.           nodo->der = nodo->izq->der;
  30.           free((void *) nodo->izq);
  31.      }
  32. }
  33. void dos_hijos(tNodo *nodo){
  34.      tNodo *aux;
  35.      *aux = suce_pred(nodo->izq);
  36.      nodo->info = aux->info;
  37.      hijo_unico(aux);
  38. }
  39. void removeHelp(tNodo *nodo, tipoElem item){
  40.      if (item == nodo->info){
  41.               if (nodo->izq == NULL && nodo->der == NULL){
  42.                             nodo = NULL;
  43.               }
  44.               else if (nodo->izq != NULL && nodo->der != NULL) dos_hijos(nodo);
  45.               else hijo_unico(nodo);
  46.      }
  47.      else if (item < nodo->info) removeHelp(nodo->izq, item);
  48.      else removeHelp(nodo->der, item);
  49. }
  50. void remove_n (tABB *T, tipoElem item){
  51.      removeHelp(T->raiz, item);
  52. }
  53.  
  54. int main(){
  55.     tABB A;
  56.     int c[7]={10,15,12,17,5,7,2};
  57.     int b;
  58.     initTree(&A);
  59.     for (b=0; b<7; b++){
  60.         inserta(&A, c[b]);
  61.     }
  62.     inOrden(&A);
  63.     printf("\n%d\n", size(&A));
  64.     remove_n(&A, 7);
  65.     printf("%d\n", find(&A, 7));
  66.     inOrden(&A);
  67.     getch();
  68. }

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.
__________________
"Porque nada se...
quiero saberlo todo"