AGB  ·  Datenschutz  ·  Impressum  







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

Binärer Suchbaum Knoten entfernen

Ein Thema von Fehlersucher · begonnen am 19. Dez 2012 · letzter Beitrag vom 5. Jan 2013
Antwort Antwort
Seite 1 von 2  1 2      
Fehlersucher

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

Binärer Suchbaum Knoten entfernen

  Alt 19. Dez 2012, 17:58
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:
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
Tja, nun ist der Code aber falsch, da hsuchbaum.zerstören unglücklicherweise den ganzen Baum zerstört.

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ß
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Binärer Suchbaum Knoten entfernen

  Alt 19. Dez 2012, 18:19
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Binärer Suchbaum Knoten entfernen

  Alt 19. Dez 2012, 19:21
Ich habe mir die Mühe gemacht es schrittweise Anhand eines Bildes erklärt 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!
Miniaturansicht angehängter Grafiken
knotenloeschen.png  
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (19. Dez 2012 um 19:31 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Binärer Suchbaum Knoten entfernen

  Alt 19. Dez 2012, 19:33
Ich habe gar keine Ahnung, wie man das in einem Fünfzeiler richtig machen soll.
Du hast fast alles richtig gemacht. Du benötigst aber den Vorgänger vom hSuchbaum, um dort dann den ZwischenBaum einzuhängen
  Mit Zitat antworten Zitat
Fehlersucher

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

AW: Binärer Suchbaum Knoten entfernen

  Alt 21. Dez 2012, 10:23
@ 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:
Du hast fast alles richtig gemacht. Du benötigst aber den Vorgänger vom hSuchbaum, um dort dann den ZwischenBaum einzuhängen
Aber dann bräuchte ich doch eine weitere Variable. Eigentlich sollte ich ja nur mit einer Variablen auskommen.

Könntest du mir einen Teilalgorithmus (als Sprachcode) zur Orientierung geben?

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Binärer Suchbaum Knoten entfernen

  Alt 21. Dez 2012, 14:36
Edit: @Zacherl
Er meinte, es soll nur ein Knoten entfernt werden. Alle darunterliegenden Subnodes müssen erhalten bleiben!
Da bin ich mir nämlich nicht so sicher, wie ich die Aufgabe verstehen darf

@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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Fehlersucher

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

AW: Binärer Suchbaum Knoten entfernen

  Alt 21. Dez 2012, 19:34
Nein, ZWISCHEN wollte ich nicht entfernen.
ZWISCHEN ist meine Zwischenvariable.

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Binärer Suchbaum Knoten entfernen

  Alt 22. Dez 2012, 16:05
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?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Fehlersucher

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

AW: Binärer Suchbaum Knoten entfernen

  Alt 2. Jan 2013, 13:12
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ß
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#10

AW: Binärer Suchbaum Knoten entfernen

  Alt 2. Jan 2013, 14:38
Ich versteh nicht, warum du mich ignorierst...
Programmieren sollte es dir keiner!

-.-
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:41 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