Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Baum laden (https://www.delphipraxis.net/171655-baum-laden.html)

Fehlersucher 17. Nov 2012 14:35

Baum laden
 
Ein Baum wurde mit dem preorder-Algorithmus gespeichert. Nun soll der Baum geladen werden:

Ich habe den Code mal wörtlich dargestellt:

Code:
Form.load (v:Binärbaum)
var
   x : Textdatei;
   y : String;
begin
 while not Dateiende(x) do
   begin
    LiesZeile(x, y);
     if y enthält Zeichen(*) then // Zeichen * markiert Blätter
      begin
        lösche Zeichen(*);//Zeichen wird gelöscht, es diente nur zum markieren
        load(v.gibRechtenBaum.erzuge(y));
        load(v.giblinkenBaum.erzeuge(y));    
      end
        else
         v.erzeuge(y);
   end;
end;
Zwar liefert dieser Algorithmus einen Baum, jedoch sind einige Sachen darin doppelt. Also entspricht der erzeugte Baum nicht dem gespeicherten Baum.

Sieht jemand wo mein Fehler ist?

Gruß

Furtbichler 19. Nov 2012 06:51

AW: Baum laden
 
Wie sieht denn die Datei aus?

Und so nebenbei:
Du liest 'y' ein. Wenn da ein '*' ist, dann erzeugst Du zwei Äste, denen Du 'y' übergibst (vermutlich der Inhalt). Das war's dann.

Alleine der Umstand, das eine rekursive Datenstruktur statisch so eingelesen wird (iterativ, ohne Stack) zeigt schon, das Du hier etwas falsch machst.

Das Laden funktioniert logischerweise genauso wie das speichern.

So würde das z.B. gehen:
Delphi-Quellcode:
Procedure TBaumKnoten.SpeichereIn (Datei : TextDatei); // TStream wäre besser
Begin
  if Assigned (Self) then begin
    Writeln(Knoteninhalt);
    SpeichereIn (LinkerAst);
    SpeichereIn (RechterAst);
  else
    Writeln('LEER');
End;

Class Function TBaumKnoten.ErzeugeBaumAusDatei(Datei : TextDatei) : TBaumKnoten; // TStream wäre besser
Var
  s : String;
Begin
  ReadLn(Datei, s);
  if s='LEER' then
    result := nil
  else begin
    result := TBaumKnoten.Create;
    result.KnotenInhalt := s;
    result.LinkerAst := ErzeugeBaumAusDatei(Datei);
    result.RechterAst := ErzeugeBaumAusDatei(Datei);
  end
end;

// Speichern:
MeinBaum.Wurzel.SpeichereIn(Datei);
...
// Laden
MeinBaum.Wurzel := TBaumKnoten.ErzeugeBaumAusDatei(Datei);

// Besser wäre so eine Methode, aber die bekomme ich mit einem Kaffee am Montagmorgen nicht hin
// MeinBaum.Wurzel.LadeAus(Datei);
Aber es geht bestimmt noch viel einfacher.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:02 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