<div dir="ltr">Hola, estoy con una práctica de la universidad y me piden tener 
controlado el stock de los libros de una libreria mediante utilizando 
árboles binarios de busqueda. Tenemos que utilizar C++. Tenemos que usar
 las funciones "ingresarLibro", venderLibro, etc.<br>El problema surge 
cuando me piden que implemente una funcion que elimine de mi arbol de 
busqueda los libros (nodos) que tengan un stock(cantidad) igual a 0.<br>Implemento
 practicamente el mismo codigo que en la funcion "venderLibro" ya que a 
esa funcion le tengo que pasar el titulo del libro a vender y se encarga
 de buscar en el árbol comparando entre nodos, si encuentra el libro, en
 caso afirmativo lo elimina sin problemas, en caso contrario, 
recursivamente sigue buscando.<br>El caso es que la funcion 
"venderLibro" funciona a la perfección y los punteros igualmente. Sin 
embargo, a la hora de implementar la funcion que me elimine todos los 
libros que encuentre con stock = 0, da interrupcion porque borra el nodo
 pero parece que en vez de dejarlo a NULL como hace la funcion 
"venderLibro", no lo hace.<br>Os dejo el código de mi funcion "venderLibro" (que funciona perfectamente) y el codigo que tengo de la otra funcion.<br><br>Código "venderLibro":<br><br><pre style="margin-top:0px;display:inline">Arbol* Arbol::descatalogar(Arbol *nodo, const char *titulo)<br>{<br>        int comp;//Declaro variable con el resultado de la comparacion entre el titulo pasado por parametro y el del nodo-arbol en el que estamos.<br>    Arbol *aux;<br>   if (nodo != NULL)<br>     {//Si hay un nodo raiz en el arbol...<br>         comp = strcmp(titulo, nodo->titulo);//Recogemos el resultado de la comparacion.<br>            if (comp == 0)<br>                {//Si la comparacion es 0 hemos encontrado el libro a descatalogar.<br>                   if (nodo->cantidad == 0)<br>                   {//Si la cantidad del libro encontrado es cero, podemos descatalogarlo.<br>                               cout << "La cantidad del libro a descatalogar es cero. Podemos continuar." << endl;<br>                             if (nodo->izq == NULL)<br>                             {//Si el nodo izquiero del libro a descatalogar apunta a NULL, nos apoyamos en un arbol aux para guardar el valor del nodo-arbol derecho.<br>                                     aux = nodo->der;<br>                           }<br>                             else if (nodo->der == NULL)<br>                                {//Si el nodo derecho del libro a descatalogar apunta a NULL, nos apoyamos en un arbol aux para guardar el valor del nodo-arbol izquierdo.<br>                                    aux = nodo->izq;<br>                           }<br>                             else<br>                          {//En caso contrario, recolocamos el arbol para que no pierda su estructura.<br>                                  for (aux = nodo->izq; aux->der != NULL; aux = aux->der);<br>                                     aux->der = nodo->der;<br>                                   aux = nodo->izq;<br>                           }<br>                             free(nodo->titulo);//Liberamos el nodo-arbol de memoria<br>                            delete(nodo);//Lo eliminamos<br>                          nodo = aux;//En su lugar ponemos el auxiliar para mantener la estructura del arbol.<br>                           cout << "El libro '" << titulo << "' ha sido correctamente descatalogado." << endl;//Mostramos mensaje de confirmacion.<br>                   }<br>                     else<br>                  {//En caso de que la cantidad no fuese 0, mostramos mensaje de error y no eliminamos nada.<br>                            cout << "No se ha podido descatalogar el libro debido a que su cantidad no era 0." << endl;<br>                     }<br>             }<br>             else if (comp < 0)<br>         {//Si la comparacion titulo-nodo->titulo es menor que 0 buscamos por la izq<br>                        nodo->izq = descatalogar(nodo->izq, titulo);<br>            }<br>             else<br>          {//En caso contrario, buscaremos por la derecha ya que quiere decir que es más grande (alfabeticamente hablando)<br>                     nodo->der = descatalogar(nodo->der, titulo);<br>            }<br>     }<br>     return nodo;//Devolvemos el nodo.<br>}<br><br>Y aquí el código de la funcion "eliminarSinStock":<br><br></pre><div class=""></div><div class=""><pre style="margin-top:0px;display:inline">void Arbol::eliminarSinStock(Arbol *nodo)<br>{<br> if (nodo != NULL)//Si no esta vacio el arbol...<br>       {<br>             eliminarSinStock(nodo->izq);//Buscamos por la izq<br>          if (nodo->cantidad == 0)<br>           {//Si la cantidad del nodo actual es 0, mostramos por pantalla su informacion.<br>                        cout << "\nTitulo del libro: " << nodo->titulo << " - Cantidad: " << nodo->cantidad << endl;<br>                  descatalogar(nodo, nodo->titulo);<br>          }<br>             eliminarSinStock(nodo->der);//Buscamos por la derecha<br>      }<br>}</pre></div><br>Cuando
 selecciono la opcion de "eliminarSinStock", la ejecuta pero la vuelve a
 hacer e ignora como que "nodo" está a NULL y claro, da error porque no 
encuentra nodo->izq... <br><br>A ver si me podeis echar un cable :S<br>Muchas gracias, un saludo. =)</div>