Autor Beitrag
jackbauer
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 08.03.07 21:58 
Hallo,

ich hätte eine Frage zum Binärbaum.

Wie kann ich alle Knoten - rekursiv - löschen und auch den Speicherplatz mit Dispose freigeben?


Vielen Dank

mfg
Code:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
// Hinzufügen
procedure TfrmMain.btnAddClick(Sender: TObject);
begin
     if(self.edValue.Text <> ''then
     begin
          new(neuz);
          neuz^.info := StrToInt(self.edValue.Text);
          neuz^.reNachF := nil;
          neuz^.liNachF := nil;

          if(wurzelz = nilthen
          begin
               wurzelz := neuz;
          end
          else
              addNewInfo(wurzelz);

          self.lstElements.Items.Clear();
          self.imgTree.Canvas.Rectangle(00, imgTree.Width, imgTree.Height);
          x := 5;
          CreateTree(wurzelz, 0);
          self.edValue.Text := '';
     end
     else
     begin
         ShowMessage('Bitte geben Sie ein Integer-Wert ein!');
     end
end;

procedure TfrmMain.addNewInfo(hwurzel : TInfoZeiger);
begin
     if(neuz.info > hwurzel^.info) then
     begin
        if(hwurzel^.reNachF = nilthen
           hwurzel^.reNachF := neuz
        else
            addNewInfo(hwurzel^.reNachF)
     end
     else if(hwurzel^.liNachF = nilthen
          hwurzel^.liNachF := neuz
     else addNewInfo(hwurzel^.liNachF);
end;

// Ausgabe

procedure TfrmMain.btnCreateTreeClick(Sender: TObject);
begin
  // Baum ausgeben

  // ListBox leeren
  self.lstElements.Items.Clear;
  // Zeichenfläche löschen
  self.imgTree.Canvas.Rectangle(00, imgTree.Width, imgTree.Height);
  x := 5;
  CreateTree(wurzelz, 0);
end;

procedure TfrmMain.CreateTree(ausgabezeiger : TInfoZeiger; tiefe : Word);
var y : Word;
begin
  // Baum zeichnen

  if(ausgabezeiger <> nilthen
  begin
    CreateTree(ausgabezeiger^.liNachF, tiefe + 1);
    y := tiefe * 30 + 10;
    x := x + 15;
    self.imgTree.Canvas.TextOut(x, y, IntToStr(ausgabezeiger^.info));
    self.lstElements.Items.Add(IntToStr(ausgabezeiger^.info));
    CreateTree(ausgabezeiger^.reNachF, tiefe + 1);
  end;
end;
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Do 08.03.07 22:41 
Hey jackbauer,

ich hab deine Quelltext nicht wirklich angeschaut, aber vielleicht hilft dir ja schon etwas "Pseudocode":
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
type
  PNode = ^TNode;
  TNode = record
    Data: Pointer;
    FirstChild: PNode;
    Next: PNode;
  end;

procedure DeleteAllNodes(const AFirst: PNode);
var
  ANode, ADelete: PNode;
begin
  ANode := AFirst;
  //alle Nodes durchgehen
  while Assigned(ANode) do begin
    //_zuerst_ Kinder löschen
    DeleteAllNodes(ANode.FirstChild);
    ADelete := ANode;
    ANode := ANode.Next;
    //Knoten löschen
    Dispose(ADelete);
  end;
end;
(Ungetestet, hoffe es geht!)

Gruß Hape!
jackbauer Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 08.03.07 23:44 
Hi,

vielen Dank für die Antwort! :)

Würde ja so nicht klappen (vermutlich), da mein Record so aussieht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    TInfoZeiger = ^TInfo;

    TInfo = record
            info : integer;
            reNachF : TInfoZeiger;
            liNachF : TInfoZeiger;
            end;


Hab ja einen linken und rechten Nachfolgen

Danke

mfg
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Fr 09.03.07 00:00 
Hallo jackbauer,

der Fehler liegt bei mir: Die Definition eines Binärbaums ist natürlich nicht jene, auf welche ich meinen Quelltext gebaut habe. Versuchs mal so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure DeleteNode(const AInfo: TInfoZeiger);
begin
  if Assigned(AInfo) then
  begin
    //_erst (beide) Kinder durchgehen_
    DeleteNode(AInfo.reNachF);
    DeleteNode(AInfo.liNachF);
    //dann Knoten löschen
    Dispose(AInfo);
    //AInfo := nil;
  end;
end;
Auch jetzt wieder aus dem Kopf, hoffe es funktioniert!

Gruß Hape!
jackbauer Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 09.03.07 00:14 
Hi,

sehr schön! Funktioniert gut :)

Vielen Dank für die Hilfe

mfg