Ich versuche, einen binären Suchbaum zu implementieren, und ich habe ein Problem mit Knoten entfernen. Ich habe einige Tests gemacht und ich denke, das einzige Problem mit meiner Funktion ist der Fall, in dem der zu entfernende Knoten hat zwei Kinder. Ich habe irgendwo in den Referenzen versaut. Es scheint ein einfaches Problem zu sein, aber ich habe versucht, es zu lange selbst zu beheben.Entfernen eines Knotens mit zwei Kindern in BST
1
A
Antwort
1
Es gibt mehrere Probleme.
Erstens, was auch immer der Fall ist, wenn Sie die x==k->val
Bedingung erreichen und es ist wahr, Sie immer müssen den Knoten löschen, der derzeit von k gezeigt wird.
if (x == k->val)
{
tmp=k; // keep track of the node to delete
... // update k but don't return (and don't change tmp)
delete tmp; // get rid of the deleted node for good
}
Dann hat der Artikel überhaupt kein Kind, man muss nur den Zeiger in der übergeordneten auf nullptr. Wenn der iem ein Kind hat, machst du einfach einen Pass-trough.
if (k->l==nullptr && k->r==nullptr)
k=nullptr;
else if (k->l==nullptr)
k=k->r;
else if (k->r==nullptr)
k=k->l;
else { //two children
...
}
Wenn der Knoten auf Kinder hat, ist es komplizierter
else { //two children
k=k->l; // take the left subtree
for (rem=k; rem->r!=nullptr; rem=rem->r)
; // find the end of its right subtree
rem->r = tmp->r; // append the right subtree at its end.
}
Hier die grafische Erklärung dessen, was hier passiert:
Verwandte Themen
- 1. Laufzeitfehler beim Löschen eines Knotens in BST
- 2. Entfernen und Anhängen eines Knotens
- 3. Rot-schwarze Bäume - Löschen eines Knotens mit zwei Nicht-Blatt-Kindern
- 4. So entfernen Sie Attribute eines Knotens (MSXML)
- 5. Entfernen eines Knotens aus einer verketteten Liste
- 6. Entfernen mehrerer Vorkommen eines Knotens in einer XMLNodeList oder Combobox
- 7. LinearLayout mit zwei Kindern von gleicher Breite
- 8. Entfernen von Kindern Elemente mit einem Index?
- 9. Kommunikation zwischen zwei Iframe-Kindern mit postMessage
- 10. Link-Liste: Einfügen eines Knotens mit Rekursion
- 11. Code Analyzer - Entfernen eines Knotens schlägt ohne Ausnahme
- 12. Löschen von Knoten in BST
- 13. Balancieren einer BST mit Gewichten
- 14. Finden eines Paares mit gegebener Summe in BST
- 15. Ermitteln der Geschwister eines Knotens mit Nokogiri
- 16. Java - Zurückgeben jedes Knotens nach einem bestimmten Element in einer BST
- 17. BST mit Duplikaten
- 18. Rabl, entfernen Sie übergeordnete Element von Kindern
- 19. Inorder-Nachfolger in BST finden, ohne zusätzlichen Speicherplatz zu verwenden
- 20. Einfügen eines Knotens zwischen Text
- 21. NullPointerException in BST
- 22. Bedeutung eines Knotens in einem Diagramm
- 23. xamDataTree Start Bearbeitung eines Knotens in Code
- 24. Abrufen von Kindern von Kindern in Firebase mit Ionic
- 25. Durchschnitt des längsten Pfades eines BST
- 26. Einfügen eines Knotens in eine XML-Datei
- 27. Löschen eines Knotens in einem Stammbaum
- 28. Erhalten letzte Auftritt eines Knotens
- 29. C++ Löschen eines Knotens in Queue
- 30. Auswahl eines ausgewählten Knotens in Dynatree aufheben
Vielen Dank :) Ich habe nur ein Problem, als ich schrieb "delete k;" Am Ende von "if (x == k-> val)" setzte es das linke Kind auf 0, aber ohne es funktioniert die Funktion gut. – vois
Entschuldigung! meine schuld: sollte löschen tmp! – Christophe