Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Binärbaum rekursiv auslesen (https://www.delphipraxis.net/166026-binaerbaum-rekursiv-auslesen.html)

Gargamel 26. Jan 2012 12:12

Binärbaum rekursiv auslesen
 
Hi

Ich möchte einen Binärbaum rekursiv auslesen. Doch leider scheint sich der PC daran zu stören, daß hier rekursiv gearbeitet wird.
Der Quellcode sieht so aus:

Delphi-Quellcode:
procedure ReadTree(node:PNode);
Begin
  if node<>nil then
  Begin
    Form1.ListBox1.Items.Add(node.name); // zu Kontrollzwecken in Listbox anzeigen
    if node.ChildNode1 <> nil then ReadTree(node.ChildNode1);
    if node.ChildNode2 <> nil then ReadTree(node.ChildNode2);
  end;
End;
Die Deklaration von PNode sieht so aus:

Delphi-Quellcode:
PNode = ^TNode;
TNode = record
   name:string;
   ChildNode1,ChildNode2:PNode;
   ParentNode:PNode;
end;

p80286 26. Jan 2012 12:18

AW: Binärbaum rekursiv auslesen
 
Wie sieht "Stören" denn aus?
Geht der Bildschirm in Flammen auf?

Gruß
K-H

Gargamel 26. Jan 2012 12:20

AW: Binärbaum rekursiv auslesen
 
Das Programm schmiert ab. :)

p80286 26. Jan 2012 12:33

AW: Binärbaum rekursiv auslesen
 
Wetten das "abschmieren mit "Endlosschleife" übersetzt wird?

Hast du es mal mit F7/F8 versucht?

Gruß
K-H

Gargamel 26. Jan 2012 12:37

AW: Binärbaum rekursiv auslesen
 
Das Programm ist nicht in einer Endlosschleife, sondern bricht mit einer Zugriffsverletzung bei Adresse xyz ab.

daywalker9 26. Jan 2012 12:39

AW: Binärbaum rekursiv auslesen
 
Dann zeig doch mal die ZEile in der das Auftritt, das zeigt dir der Debugger ja an.

Und zeige mal, wie Du die Elemente in die Liste einfügst.

Gargamel 26. Jan 2012 12:41

AW: Binärbaum rekursiv auslesen
 
Das Programm bricht hier ab:

Delphi-Quellcode:
if node.ChildNode1 <> nil then ReadTree(node.ChildNode1);


Der komplette Code steht hier: http://www.delphipraxis.net/165995-b...-anwenden.html
(Die Funktion ReadTree(...) und deren Aufruf in TForm1.Button1Click(...) kommt dann halt noch hinzu.)

Gargamel 26. Jan 2012 15:06

AW: Binärbaum rekursiv auslesen
 
Ich habe es hinbekommen. Der Fehler war, daß ich bei der Initialisierung der Knoten vergessen hatte, den nicht existierenden Kindknoten noch ein nil zu verpassen.

Aphton 26. Jan 2012 16:52

AW: Binärbaum rekursiv auslesen
 
Die zwei weiteren If-Abfragen sind unnötig, denn beim nächsten Durchlauf wird sowieso darauf geprüft!
Wegmachen!

Caesar2012 31. Jan 2012 16:35

AW: Binärbaum rekursiv auslesen
 
EDIT: Delete

shmia 31. Jan 2012 16:56

AW: Binärbaum rekursiv auslesen
 
Hier noch eine kleine Verbesserung um den Forscherdrang zu befriedigen:
Mit dem Parameter "Level" kann man nachverfolgen, wie tief ein Knoten im Baum steckt.
Beim 1. Aufruf gibt übergibt man den Level mit 0.

Das "Abgrasen" eines Baums nennt man übrigens "Besuchen" oder "Traversieren";
Delphi-Quellcode:
procedure VisitTree(node:PNode; Level:integer); // preorder traversal
Begin
  if node<>nil then
  Begin
    Form1.ListBox1.Items.Add(Format('%s [%d]', [node.name, Level]); // zu Kontrollzwecken in Listbox anzeigen
    VisitTree(node.ChildNode1, Level + 1);
    VisitTree(node.ChildNode2, Level + 1);
  end;
End;
Schau mal was passiert, wenn man die Reihenfolge des Besuchens umstellt:
Delphi-Quellcode:
procedure VisitTree(node:PNode; Level:integer); // inorder traversal
Begin
  if node<>nil then
  Begin
    VisitTree(node.ChildNode1, Level + 1);
    Form1.ListBox1.Items.Add(Format('%s [%d]', [node.name, Level]); // zu Kontrollzwecken in Listbox anzeigen
    VisitTree(node.ChildNode2, Level + 1);
  end;
End;


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