AGB  ·  Datenschutz  ·  Impressum  







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

Baum laden

Ein Thema von Fehlersucher · begonnen am 17. Nov 2012 · letzter Beitrag vom 19. Nov 2012
Antwort Antwort
Fehlersucher

Registriert seit: 10. Nov 2012
32 Beiträge
 
#1

Baum laden

  Alt 17. Nov 2012, 14:35
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ß
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: Baum laden

  Alt 19. Nov 2012, 06:51
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='LEERthen
    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.

Geändert von Furtbichler (19. Nov 2012 um 07:08 Uhr)
  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 22:08 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