• Viernes 29 de Marzo de 2024, 15:25

Autor Tema:  Vaciar Arbol Binario  (Leído 2407 veces)

Ocean Soul

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Vaciar Arbol Binario
« en: Jueves 6 de Octubre de 2005, 12:38 »
0
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
  1.  
  2. type
  3.         PtrTree=^Tree;
  4.         Tree=record
  5.                 info:TRotulo;
  6.     HD,HI:ptrTree;
  7.                 end;
  8.   Arbol=ptrTree;
  9. {-----------------------------------------------------------------------------------}
  10. {Primero viene el de mas abajo}
  11. Procedure VaciarArbolAux(A:arbol);
  12. Begin
  13.   if not ArbolVAcio(A) then
  14.   Begin
  15.     VaciarArbolAux(a^.HD);
  16.     VaciarArbolAux(A^.HI);
  17.                 if A<>nil then
  18.                               Dispose(A);
  19.   end;  
  20. end;
  21. {-----------------------------------------------------------------------------------}
  22. Procedure VaciarArbol(var A:arbol);
  23. Begin
  24.   if not ArbolVAcio(A) then
  25.   Begin
  26.     VaciarArbolaux(a);
  27.                                 a:=nil;
  28.   end;
  29. end;
  30.  
  31.  

PD: Si esta mal, me ayudan ha hacerlo bien????  :huh:

Alpha_

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
Re: Vaciar Arbol Binario
« Respuesta #1 en: Domingo 9 de Octubre de 2005, 06:36 »
0
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
  1. procedure VaciarArbol(var A: Arbol);
  2. begin
  3.   if A <> nil then
  4.   begin
  5.     VaciarArbol(A^.HI);
  6.     VaciarArbol(A^.HD);
  7.     Dispose(A);
  8.   end;
  9. end;
  10.  

Sólo porque pasaba.. xD
Alpha
http]

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Vaciar Arbol Binario
« Respuesta #2 en: Domingo 9 de Octubre de 2005, 16:03 »
0
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
  1. procedure VaciarArbol(var A: Arbol);
  2. begin
  3.   if A <> nil then
  4.   begin
  5.     VaciarArbol(A^.HI);
  6.     VaciarArbol(A^.HD);
  7.     Dispose(A);
  8.   end;
  9. end;
  10.  

Sólo porque pasaba.. xD
Definitivamente faltaba ese A<>nil y queda bastante elegante.

Ocean Soul

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Vaciar Arbol Binario
« Respuesta #3 en: Martes 11 de Octubre de 2005, 02:09 »
0
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

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Vaciar Arbol Binario
« Respuesta #4 en: Sábado 15 de Octubre de 2005, 15:25 »
0
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.
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.