AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Binärer Baum, Blätter durchegehen

Ein Thema von Quolz · begonnen am 5. Jun 2007 · letzter Beitrag vom 5. Jun 2007
Antwort Antwort
Quolz

Registriert seit: 7. Feb 2006
3 Beiträge
 
Delphi 7 Professional
 
#1

Binärer Baum, Blätter durchegehen

  Alt 5. Jun 2007, 13:08
Hallo Leute,

Ich habe follgendes Problem, welches der Problematik eines Binären Baum ähnlich kommt:

Ich hab mehrere Objekte welche eine variable Anzahl Unterobjekte besitzen können. Diese Unterobjekte können wiederum eine variable Anzahl Unterobjekte besitzen usw. Nun sollte ich alle Objekte durchlaufen und von jedem Objekt den Namen in ein Textfile speichern.

Ich hab mir das nun irgendwie so vorgestellt:

Delphi-Quellcode:
for i:= 0 to myObject.count-1 do
begin
  with myObject.Objects[i] do
  begin
    for z:= 0 to count-1 do
    begin
      //usw. ich sollte das irgendwie dynamisch machn, da es eine variable Anzahl Unterobjekte hat
    end;
  end;
end;

Wäre für einen Denkanstoss dankbar.

~Quolz~
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Binärer Baum, Blätter durchegehen

  Alt 5. Jun 2007, 13:11
Rekursion, das Wort heißt Rekursion!

Delphi-Quellcode:
procedure WriteObject(Obj: TMyObjectte; AStream: TFileStream);
var i,s: Integer;
   
begin
  s := length(Obj.Name);
  AStream.Write(s,sizeof(s));
  AStream.Write(Obj.Name[1],s);
  for i := 0 to Obj.ChildCount-1 do
    WriteObject(Obj.Childs[i],AStream);
end;
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Quolz

Registriert seit: 7. Feb 2006
3 Beiträge
 
Delphi 7 Professional
 
#3

Re: Binärer Baum, Blätter durchegehen

  Alt 5. Jun 2007, 13:19
Super das wars, danke vielmals!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: Binärer Baum, Blätter durchegehen

  Alt 5. Jun 2007, 13:49
Zitat von DGL-luke:
Rekursion, das Wort heißt Rekursion!
Rekursion ist nur der elegante, intuitive und einfachere Weg. An sich kannst Du einfach nach Traversieren suchen (also google), da solltest Du schnell recht viele Arten finden einen Baum (oder andere Strukturen) zu durchlaufen. Alle lassen sich immer sehr einfach und elegant mittels Rekursion lösen. Was Du aber auch wissen (im Hinterkopf behalten) solltest ist, dass Rekursion immer dazu neigt deinen Stack zu füllen.
Jeder rekursive Aufruf der gleichen Methode unterbricht an der entsprechenden Stelle die weitere Abarbeitung und führt erst den Aufruf der Methode komplett durch. Da hier jedoch irgendwann eine Rückkehr stattfinden muss, wird eben der Zustand der Methode vorher auf den Stack geschoben und bei Rückkehr wieder vom stack genommen. Lange Rede kurzer Sinn, ist Dein Baum nur breit/hoch genug, so kommt es schnell mal zum Stack-Overflow.

Deshalb ist der weniger schönere, weniger elegantere und auch weniger intuitivere Weg nicht aussen vor zu lassen. Du kannst einfach eine Liste verwenden, in der Du alle noch zu betrachtenden Knoten speicherst. Am Anfang packst Du einfach die Wurzel rein. Nun gehst Du in eine Schleife, die solange ausgeführt wird, bis die Liste leer ist. Hier entnimmst Du einfach das erste Element, trägst den Namen in die Namensliste ein und schaust ob der Kinder hat. Ist dem der Fall, werden die Kinder einfach in die Knotenliste gepackt. Dabei verläst Du nie die Methode und der Stack bleibt auch bei noch so vielen Zugriffen unberührt (wobei ich einfach davon ausgehe, dass Du die Knoten auf dem Heap erzeugst )

Delphi-Quellcode:
procedure WriteObjects(Root: TMyObject; out names: TStrings);
var nodes: TObjectList;
    currentNode: TMyObject;
    i: Integer;
begin
  names := TStringList.Create;
  nodes := TObjectList.Create;
   
  if assigned(Root) then
  begin
    nodes.add(root);
 
    // hier die eigentliche Schleife, solange noch Knoten in der liste sind
    while nodes.Count > 0 do
    begin
      // ersten knoten aus der Liste entfernen (ohne ihn frei zugeben!)
      currentNode := TMyObject(nodes.extract[nodes.first]);
      // Namen speichern
      names.add(currentNode.Name);
      // Kinder in die Liste der Knoten einfügen
      if currentNode.ChildCount > 0 then
      begin
        for i := 0 to currentNode.ChildCount - 1 do
        begin
          nodes.add(currentNode.Children[i]);
        end;
      end;
    end;
  end;
end;
Gruß Der Unwissende
  Mit Zitat antworten Zitat
Flax

Registriert seit: 12. Mär 2003
76 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Binärer Baum, Blätter durchegehen

  Alt 5. Jun 2007, 13:58
Ist der Umstand wirklich gerechtfertig? Für einen Rücksprung wird doch nur sehr wenig Speicher benötigt im Stack. Da müssen schon über 100erte Von Verschachtelungen stattfinden, damit das Probleme macht.

Ich würde erst mal die Rekursion testen und mich fragen, wie weit meine Bäume verzweigt sind.

Den Stack verfügtbaren max. Stack könnte man auch erhöhen in seinem Projekt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23: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