![]() |
Binärer Suchbaum Knoten entfernen
Hallo,
ich soll einen Teilalgorithmus schreiben, durch welchen ein Knoten aus einem binären Suchbaum entfernt wird. Der zu entfernende Knoten hat lediglich ein Kind (linke Seite). Der folgende Code ist Sprachcode um meinen Gedankengang zu veranschaulichen.
Delphi-Quellcode:
Tja, nun ist der Code aber falsch, da hsuchbaum.zerstören unglücklicherweise den ganzen Baum zerstört.
var hsuchbaumZWISCHEN, hsuchbaum : TBinärsuchbaum;
... // hier würden noch andere Teile der Prozedur stehen hsuchbaumZWISCHEN := hsuchbaum.giblinkenBaum; hsuchbaum.zerstoeren; hsuchbaum.einfuegen(hsuchbaumZWISCHEN); ... // hier würden noch andere Teile der Prozedur stehen Mein Teilalgorithmus ist ein Dreizeiler, aber damit es richtig funktioniert müsste es ein Fünfzeiler sein. :? Ich habe bruchstückweise noch irgendwie folgendes mitbekommen: - Es ist ok, wenn hsuchbaum (im Teilalgorithmus) ganz zerstört wird - Man kommt mit der Zwischenvariable hsuchbaumZWISCHEN aus und braucht keine weitere Variable - Irgendwie soll man glaube ich den hsuchbaumZWISCHEN verwenden und nach diesem ein Inhaltsobjekt einfügen, oder so Ich habe gar keine Ahnung, wie man das in einem Fünfzeiler richtig machen soll. Kann mir jemand (in Sprachcode) helfen? Gruß |
AW: Binärer Suchbaum Knoten entfernen
Im Prinzip ist das Vorgehen ja folgendes:
1) Root Node des Knotens ermitteln 2) Betreffenden Knoten unlinken, indem das entsprechende Left oder Right Feld nil gesetzt wird 3) Je nach Aufgabenstellung die Korrektheit des binären Suchbaums wiederherstellen Hierdurch entfernst du den Knoten und alle darunterliegenden SubNodes. |
AW: Binärer Suchbaum Knoten entfernen
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mir die Mühe gemacht es schrittweise Anhand eines Bildes erklärt :D Hoffe, dir wird nun klar, wie es funzt.
1. Ein sortierter Binärbaum ist gegeben 2. Der Knoten "25" soll entfernt werden 3. Entfernung des Knotens (left, right & parent merken!) Weg A 4. Du ermittelst den linkesten Knoten vom rechten Teil (= 30) Weg B 4. Du ermittelst den rechtesten Knoten vom linken Teil (= 10) 5. Dieser Knoten übernimmt nun einfach all die Werte vom zerstörten Knoten (left/right/parent). 6. Der Knoten, der bei 4 ermittelt wurde, wird im Anschluss mit derselben Routine auch zerstört Btw. es ist egal, ob du Weg A oder Weg B gehst. Vlt ist Punkt 6. nicht ganz klar - weil es sein kann, dass dieser Knoten einen Nachbarn hat, muss es nochmal ausgeführt werden. Denk dir einfach, dass die Knoten 10 und 30 jeweils auch Kinder besitzen [10 besitzt 9 (left) und 30 besitzt 31 (right)] Noch etwas - ich weiß nicht, wie weit ihr im Unterricht schon seid, aber Schritt 6 verlangt, dass der Algorithmus rekursiv ist! Edit: @Zacherl Er meinte, es soll nur ein Knoten entfernt werden. Alle darunterliegenden Subnodes müssen erhalten bleiben! |
AW: Binärer Suchbaum Knoten entfernen
Zitat:
|
AW: Binärer Suchbaum Knoten entfernen
@ Aphton:
Danke für die Beschreibung. Aber dies scheint mir zu viel zu sein. Es wurden eigentlich keine Abstände gezählt (man brauchte ja auch keine weitere Variable). @ Furtbichler: Zitat:
Könntest du mir einen Teilalgorithmus (als Sprachcode) zur Orientierung geben? Gruß |
AW: Binärer Suchbaum Knoten entfernen
Zitat:
@Fehlersucher: Deinem Code oben entnehme ich, dass du ZWISCHEN entfernen willst. Da du ZWISCHEN mit Suchbaum.getLinken() ermittelst, ist Suchbaum selbst folglich die Root Node von ZWISCHEN. In diesem Falle setzt du einfach Suchbaum.left auf nil und zerstörst den vorher ermittelten ZWISCHEN. Hierbei nochmal der Hinweis, dass dann auch alle Unterknoten von ZWISCHEN gelöscht werden. Willst du das verhindern und trotzdem die Korrektheit des Baums beibehalten, musst du dich an Aphtons Algorithmus halten. |
AW: Binärer Suchbaum Knoten entfernen
Nein, ZWISCHEN wollte ich nicht entfernen.
ZWISCHEN ist meine Zwischenvariable. Gruß |
AW: Binärer Suchbaum Knoten entfernen
Dann nochmal ein Paar Fragen, um Klarheit zu bekommen:
1) Enthält deine TSuchbaum Klasse eine Funktion getRoot() / getParent() bzw. irgendeine Funktion, die dir die übergeordnete Node zurückgibt? 2) Willst du wirklich nur einen Knoten entfernen und die Elemente, die sich darunterbefinden beibehalten oder sollen die Unterknoten der entfernten Node auch zerstört werden? |
AW: Binärer Suchbaum Knoten entfernen
Entschuldigung, dass ich so spät schreibe. Hatte einige Zeit nicht mehr reingeguckt.
1) Nein, TSuchbaum enthält keine derartigen Klassen 2) Es soll nur ein Knoten entfernt werden, alle Unterknoten sollen beibehalten werden. Es ist natürlich fraglich, wie ich die Unterknoten jetzt richtig an den Baum hänge. Könnte mir jemand Sprachcode etc. zeigen? Hat jemand vielleicht allgemeinen Sprachcode für eine Löschprozedur von Knoten? Gruß |
AW: Binärer Suchbaum Knoten entfernen
Ich versteh nicht, warum du mich ignorierst...
Programmieren sollte es dir keiner! -.- |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz