Java -, Binär-Baum remove-Methode
Ich versuche zu schreiben remove(node cRoot, Object o)
Funktion für einen sortierten binären Baum.
Hier ist was ich habe, so weit:
private boolean remove(Node cRoot, Object o) {
if (cRoot == null) {
return false;
}
else if (cRoot.item.equals(o)) {
//erase node fix tree
return true;
}
else if (((Comparable)item).compareTo(cRoot.item)<=0){
return remove(cRoot.lChild, o);
}
else {
return remove(cRoot.rChild,o);
}
}
Funktioniert es nicht richtig. Um einen node zu löschen, die Sie reparieren müssen, den Baum zu fixieren das Loch. Wie sollte dies gemacht werden?
Der Baum beheben wird, hängt vom Algorithmus, die Sie verwenden, um die balance der Baum.
InformationsquelleAutor user101934 | 2009-05-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grundsätzlich gibt es zwei Möglichkeiten der Durchführung einer entfernen auf dem Baum:
Erste Methode:
Entfernen den Knoten, dann ersetzen Sie es entweder mit Kind. Dann, resort-der Baum by doing-Eltern-Kind-swapping, bis der Baum wieder sortiert.
Die zweite Methode:
Traverse den Baum zu finden, den nächsten (höchsten oder niedrigsten) Wert, gehört als root*, wenn es ein Blatt ist Knoten, der swap, die mit der Wurzel, dann schneiden Sie den Wert, den Sie entfernen möchten. Wenn es einen internen Knoten suchen, müssen Sie rekursiv aufrufen entfernen, die auf diesem Knoten. Wiederholen Sie, bis ein Blatt-Knoten wird entfernt.
*Was ich meine ist, wenn Sie konvertieren Sie Ihre BST in einer sortierten Liste, dann werden Sie wollen, wählen Sie entweder den Wert Links oder rechts von der Wurzel die neue Wurzel. I. e. weitesten Links stehende Kind des rechten teilbaums oder rechts, die meisten Kinder von den linken Teilbaum.
Zweite Methode - was Sie tun möchten, ist zu finden die nächst größeren Knoten (z.B. rechts, dann nach Links so weit wie Sie können) und swap-Wert mit ihm. Er wird nur eine oder keine Kinder, damit kann man dann aufheben, das element direkt. Keine Wiederholung erforderlich ist.
1. Methode, die Sie verwenden, um eine Konvention, die entweder immer vertauschen Links oder rechts, Knoten, und verwenden Sie die anderen Knoten, wenn keine vorhanden ist. 2. Methode, nicht unbedingt, es ist möglich, dass die linken Knoten des rechten teilbaums kann eine richtige sub-Baum mit Werten größer als er.
InformationsquelleAutor z -
Den grundlegenden pseudo-code für das löschen eines Knotens aus einem sortierten Baum ist ziemlich einfach:
Im Grunde, was Sie tun, ist die sprudelnden Knoten oben auf dem Baum, jedes mal, wenn das maximum der Kinder-Knoten in jedem Knoten, so dass am Ende Sie bleiben mit einem sortierten Baum, und nur ein Knoten fehlt am Ende den vollständigen Pfad, den Sie ging.
Auch - siehe wikipedia zum Thema, haben Sie einige Beispiel-code in C sowie.
InformationsquelleAutor Yuval Adam
In der einfachen case3 Sie können neben-Algorithmus:
In komplizierter Fall, müssen Sie möglicherweise ein neues Gleichgewicht Ihrer Struktur (siehe AVL-Bäume, http://www.cmcrossroads.com/bradapp/ftp/src/libs/C++/AvlTrees.html für Beispiel C++)
AVL-Bäume benötigen ein rebalancing-scan auf jeden - Knoten entfernen, außer, dass ich denke, wo der Knoten ist ein Blatt und der Eltern, nach dem entfernen hat sich ein balance-Faktor von 1 oder -1 (z.B. wenn der Knoten ein Blatt ist und einen Bruder hat).
InformationsquelleAutor Alex
InformationsquelleAutor user101934
Fand ich diesen code auf Habrahabr. Ich habe nur kommentiert.
InformationsquelleAutor guzoff