Programación General > Pascal

 Vaciar Arbol Binario

(1/1)

Ocean Soul:
Hola de nuevo, queria preguntarles, esta mal lo que hice?
O sea la intencion es querer borrar el arbol binario, pero no se si estoy borrando o simplemente generando basura en memoria.

Otra Pregunta que se me desprende de esta es:
Cuando uno pasa un puntero por valor, que es lo que hace Pascal?
Copia un puntero a la variable pasada por valor (en este caso A) o crea todo la estructura denuevo? Cuando vean el codigo van a entender mejor lo que digo.



--- Código: Text --- type        PtrTree=^Tree;        Tree=record                info:TRotulo;    HD,HI:ptrTree;                end;  Arbol=ptrTree;{-----------------------------------------------------------------------------------}{Primero viene el de mas abajo}Procedure VaciarArbolAux(A:arbol);Begin  if not ArbolVAcio(A) then  Begin    VaciarArbolAux(a^.HD);    VaciarArbolAux(A^.HI);                if A<>nil then                              Dispose(A);  end;  end;{-----------------------------------------------------------------------------------}Procedure VaciarArbol(var A:arbol);Begin  if not ArbolVAcio(A) then  Begin    VaciarArbolaux(a);                                a:=nil;  end;end;  
PD: Si esta mal, me ayudan ha hacerlo bien????  :huh:

Alpha_:
No, está bien... habría que ver qué hace el ArbolVacío(), porque quizás estés con un problema ahí.. pero hasta ahora está perfecto.

Sobre pasar los punteros por valor, Pascal hace una copia del puntero en esa variable. Si hacés un Dispose(ptr), entonces esa memoria se libera, y el puntero pasa a ser nil... pero el puntero original, todavía está apuntando a una zona de memoria, que ya fue liberada, por ende, cuidado con eso.

Es preferible pasarlos siempre por referencia, de modo que siempre se trabaje con el mismo puntero... Bah, por lo menos así pienso yo.

---

Te incluyo como lo haría yo, usaría sólo un procedimiento.


--- Código: Text ---procedure VaciarArbol(var A: Arbol);begin  if A <> nil then  begin    VaciarArbol(A^.HI);    VaciarArbol(A^.HD);    Dispose(A);  end;end; 
Sólo porque pasaba.. xD

Amilius:

--- Cita de: "Alpha_" --- No, está bien... habría que ver qué hace el ArbolVacío(), porque quizás estés con un problema ahí.. pero hasta ahora está perfecto.

Sobre pasar los punteros por valor, Pascal hace una copia del puntero en esa variable. Si hacés un Dispose(ptr), entonces esa memoria se libera, y el puntero pasa a ser nil... pero el puntero original, todavía está apuntando a una zona de memoria, que ya fue liberada, por ende, cuidado con eso.

Es preferible pasarlos siempre por referencia, de modo que siempre se trabaje con el mismo puntero... Bah, por lo menos así pienso yo.

---

Te incluyo como lo haría yo, usaría sólo un procedimiento.


--- Código: Text ---procedure VaciarArbol(var A: Arbol);begin  if A <> nil then  begin    VaciarArbol(A^.HI);    VaciarArbol(A^.HD);    Dispose(A);  end;end; 
Sólo porque pasaba.. xD
--- Fin de la cita ---
Definitivamente faltaba ese A<>nil y queda bastante elegante.

Ocean Soul:
Gracias por responder. Me quedo claro. En cuanto al que hacer arbolVacio(a) simplemente esto: ArbolVacio:=(A=nil) no lo escribi porque me parecio bastante claro, pero buh...  :D
   Como sea gracias.

Amilius:

--- Cita de: "Ocean Soul" --- Gracias por responder. Me quedo claro. En cuanto al que hacer arbolVacio(a) simplemente esto: ArbolVacio:=(A=nil) no lo escribi porque me parecio bastante claro, pero buh...  :D
   Como sea gracias.
--- Fin de la cita ---
Pues no es nada claro. Ese "ArbolVacio" podría bien hacer barbaridad y media, o recorrer todo el arbol recursivamente o quien sabe que podría hacer.

Suponer en lugar de investigar no es para nada una buena idea.

Navegación

[0] Índice de Mensajes

Ir a la versión completa