Entwickler-Ecke

Algorithmen, Optimierung und Assembler - binärer suchbaum: blätter löschen


Zwecklos - Mi 07.09.05 21:27
Titel: binärer suchbaum: blätter löschen
hallo erstma!
ich kenne mich hier noch nicht so wirklich aus und weiß deshalb nicht ob ich das richtige forum erwischt habe :)

ich habe einen binären suchbaum und möchte nun eine (rekursive?) prozedur schreiben, die mir alle blätter des baumes löscht...

irgendwie komme ich bei der sache aber auf keinen grünen zweig :mrgreen:
hat jemand vielleicht so ne prozedur parat oder kann mir nen heißen tipp geben?

vielen dank im voraus, mfg Zwecklos


uall@ogc - Mi 07.09.05 21:32

1) musst du schon sagen wie der suchbaum aufgebaut ist, d.h. wie die records aussehen
2) musst du uns zeigen das du schon mal was versucht hast, hier wird dir keiner etwas fertiges programmieren


delfiphan - Mi 07.09.05 21:32

Du musst nur eine Prozedur "Loeschen" implementieren, welche zuerst die Kinderobjekte löscht, dann sich selbst. Danach musst du nur den Root löschen, dann geht alles von alleine.


Zwecklos - Mi 07.09.05 21:43

@ uall@ogc

Ersten:

Delphi-Quelltext
1:
2:
3:
4:
5:
type Pknoten = ^tbaum;
     tbaum = Record
             info: integer;
             left, right: Pknoten;
             END;


Zweitens:
Ich habe noch nicht viel und hab auch keine ahnung ob ich annähernd auf dem richtigen weg bin, aber bitte: :)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure hexler(B :Pknoten);
begin
if B <> Nil then begin
  if (B^.left = Niland (B^.right = Nilthen begin
    dispose(B);
  end
  else dispose(B);
end;
end;




@delfiphan

ich möchte ja nur die "Kinder", also die Knoten ohne nachfolger löschen, welche ich als "Blätter" kennengelernt habe :)


Zwecklos - Mi 07.09.05 21:44

also mein ansatz ist irgendwie voll schmarn, aber ich weiß nicht wie ich zuerst die kinder auf nachfolger überprüfen soll, dann die kinder löschen und dann die vorgänger der kinder auf nil setzen kann


Zwecklos - Mi 07.09.05 21:46

sorry für das mehrfachposting, aber den ansatz kuckt ihr euch am besten gar nicht an, da hab ich grade halb was verändert gehabt und dann ging alles durcheinander :)
sorry ^^


delfiphan - Mi 07.09.05 21:59

Wenn du nur die Elemente löschen willst, die keine Nachkommen haben, funktioniert das ähnlich...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure LoescheBlaetterVonBaum(var B: Pknoten);
begin
  if (B^.left = niland (B^.right = nilthen
  begin // Hat keine Nachkommen => sich selbst löschen
   Dispose(B);
   B := nil;
  end else
  begin // Hat Nachkommen => Befehl weitergeben
   if B^.left <> nil then LoescheBlaetterVonBaum(B^.left);
   if B^.right <> nil then LoescheBlaetterVonBaum(B^.right);
  end;
end;


Zwecklos - Mi 07.09.05 22:05

Vielen Dank Delfiphan für die schnelle Hilfe! Spitze! :wave: