liberarArbol - duda de implementacion

liberarArbol - duda de implementacion

de Nelson Alfredo Causa Gonzalez -
Número de respuestas: 5

Para liberar un árbol estoy usando el siguiente razonamiento, no se si esta en lo correcto y si esto libera la memoria que usa el árbol o estoy errado:

si( t->der == NULL y t->izq == NULL){ 

     t=NULL

}sino{

     liberar(t->izq)

     liberar(t->der)

     liberar(t)



En respuesta a Nelson Alfredo Causa Gonzalez

Re: liberarArbol - duda de implementacion

de Matias Richart -
Hola Nelson.

Disculpa que quedó esta consulta sin responder.
Tu algoritmo tiene algunos aspectos a mejorar:
- Falta considerar que t pueda ser vacío, es decir, el caso t==NULL no está considerado en tu algoritmo.
- Para liberar la memoria de un nodo, se debe usar la operación delete
- Para que al liberar la memoria de un nodo no se pierdan las referencias a sus hijos, hay que asegurarse que ambos hijos sean vacíos.

Saludos
En respuesta a Matias Richart

Re: liberarArbol - duda de implementacion

de Luciana Munhos Fioravanzo -
Hola,
Tengo una duda respecto a este ejercicio. No entiendo que esta mal en el razonamiento de este codigo. Al ejecutarlo, me da cualquier cosa.

void liberarArbol(AB a){
if (a != NULL){
AB aux = a;
liberarArbol(a->izq);
liberarArbol(a->der);
delete(aux);
aux = NULL;
}
}
Agradezco me puedan dar algun pique!

Saludos,
Luciana.
En respuesta a Luciana Munhos Fioravanzo

Re: liberarArbol - duda de implementacion

de Fernando Fernandez -
Hola
Me parece que ese código está bien. La asignación a aux no tiene utilidad porque es una variable local, pero no provocaría ningún error.
No se que es ese "cualquier cosa" pero supongo que es porque estás usando el parámetro con el que invocás la función, lo cual no deberías hacer hasta después de haberle vuelto a asignar un valor.

Lo explico con más detalle. Supongamos que tenés
(1) Ab a;
Aquí 'a' no es el árbol vacío; solo podés usarlo a la izquierda de una asignación. No lo podés pasar como parámetro ni comparar con NULL, ni con otro puntero de tipo AB.
(2) a = NULL;
// o a = new nodo
// o a = otro árbol
// o a = llamado a función que devuelve AB
Ahora sí, podés usar 'a' como parámetro de alguna función

Cuando llamás a liberarArbol
(3) liberarArbola);
lo que estás haciendo es volver 'a' al mismo estado de (1), no al de (2). No estás obteniendo el árbol vacío.
Para poder usar 'a' deberías hacer lo mismo que en (2)
(3) liberarArbol(a);
(4) a = NULL;

Otra opción es que liberarArbol le asigne NULL a 'a' (mi opinión es que en ese caso no debería llamarse liberarArbol sino algo así como vaciarArbol, que además de dejar el árbol vacío libere la memoria que tiene asignada). Para eso deberías hacer algo así;
void liberarArbol (AB &a) {
// aquí el código que pusiste pero en vez de aux = NULL
  a = NULL;
}
Ahora sí, con
(3) liberarArbol (a)
'a' queda vacío y puede usarse.
¿Haciendo esto se resuelve el problema?
En respuesta a Fernando Fernandez

Re: liberarArbol - duda de implementacion

de Luciana Munhos Fioravanzo -
Hola,
Ya lo corregi y funciona. Ademas de eso, revise mi funcion imprimir y daba error al pasarle un arbol vacio (vi esto luego de arreglar la funcion).
El codigo quedo asi:
void liberarArbol(AB &a){
if (a != NULL){
liberarArbol(a->izq);
liberarArbol(a->der);
delete(a);
a = NULL;
}
}
Muchas gracias a ambos!!
Saludos