Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi binärbaum -> alle blätter entfernen (https://www.delphipraxis.net/34281-binaerbaum-alle-blaetter-entfernen.html)

brutus 20. Nov 2004 13:59


binärbaum -> alle blätter entfernen
 
hallo an alle erstmal,
ich wollte wissen wie man bei einem binärenbaum mit einer prozedur alle blätter (d.h. wissenselemente ohne nachfolger) löschen kann?!
ich dachte schon an folgendes:;
Delphi-Quellcode:
procedure TForm1.herbst;

  procedure rek (VAR p:PKnot);
   BEGIN
    IF (p^.left<>NIL) OR (p^.right<>NIL) THEN
     begin
      rek(p^.left);
      rek(p^.right);  
     end
    ELSE dispose(p) //hier evtl. noch eine abfrage ob der knoten im hilfsarray steht
   END

begin
rek(root);
end;
das problem hierbei ist ja bloss dass durch die rekursion alle elemente gelöscht werden würde.
ich dachte schon an ein hilfsarray in dem ich die vorgängerknoten der blätter speichere und dies noch beim Else Zweig abfrage.
Ich würde dass aber gerne irgendwie effektiver lösen !
Habt ihr da nicht irgendeinen vorschlag???

mfg brutus

atreju2oo0 20. Nov 2004 15:08

Re: binärbaum -> alle blätter entfernen
 
Delphi-Quellcode:
procedure TForm1.herbst;

  function rek (VAR p:PKnot):PKnot;
   BEGIN
    result:=p;
    IF (p^.left=NIL) and (p^.right=NIL) THEN
     begin
      result:=nil;
      dispose(p);
     end
    ELSE
     begin
      if p.left<>nil then p.left:=rek(p.left);
      if p.right<>nil then p.right:=rek(p.right);
     end;
   END

begin
root:=rek(root);
end;
So müsste es eigentlich funktionieren!
Das mit der Function statt procedure ist auf jeden Fall sehr wichtig, da ansonsten leere Vewrweise entstehen!

brutus 20. Nov 2004 15:25

Re: binärbaum -> alle blätter entfernen
 
wahrscheinlich bloss zu doof das zu raffen: aber werden beim rekursiven aufstieg nicht auch die koten gelöscht die vor dem aufruf der function noch keine blätter waren???

atreju2oo0 21. Nov 2004 11:33

Re: binärbaum -> alle blätter entfernen
 
Ne... :zwinker:

IF (p^.left=NIL) and (p^.right=NIL) THEN

Diese Bedingung würde ja nicht erfüllt sein und somit springt er automatisch in den Else Zweig...

Da solltest im Übrigen die Frage als gelöst markieren oder sagen was nicht funktioniert...

brutus 21. Nov 2004 14:25

Re: binärbaum -> alle blätter entfernen
 
ok danke :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz