Ich bin mit ein wenig Mühe denken, wie zum Teufel ich die entsprechenden Zeiger zu beheben, wenn Sie versuchen, einen Knoten aus einem binären Baum zu löschen, wo dieser Knoten 2 Kinder hat.
Ich verstehe das Grundkonzept, und ich bin im Grunde nur mit Schwierigkeiten bei der Festsetzung der Zeiger ...
Also, im Grunde ist meine Löschfunktion größtenteils fertig und jeder Fall funktioniert bereits (soweit meine umfangreichen Tests gehen, alles funktionierte OK), ich bin nur der Fall-Knoten mit 2 Kindern fehlt. Nehmen wir an, wir befinden uns innerhalb der else if
die sich mit diesem Fall befasst:
Ich werde dort 2 Zeiger haben, currPtr
der den zu löschenden Knoten enthält, prevPtr
der den übergeordneten Knoten enthält. Ich habe auch eine Variable namens fromLeft
die definiert, ob die currPtr
Elternteil kommt von dem linken oder rechten Zeiger auf prevPtr
. Dann habe ich einen Aufruf einer anderen Funktion namens extractMin(Tree *t)
der den niedrigsten Wert im Baum extrahiert. Wenn ich diese Funktion mit currPtr->right
als Argument, den Nachfolger von currPtr
aus dem Baum extrahiert werden soll (die Funktion löscht ihn aus dem Baum, fixiert die Zeiger und gibt den Knotenzeiger zurück). Der Nachfolger-Zeiger wird gespeichert auf tempPtr
.
Hier ist die Struktur meines Baumes:
typedef int TreeElement;
typedef struct sTree {
TreeElement item;
struct sTree *left;
struct sTree *right;
} Tree;
Und der Code für die Extraktionsfunktion:
Tree *extractMin(Tree *tree) {
Tree *prevPtr = NULL;
Tree *currPtr = tree;
while(currPtr->left) {
prevPtr = currPtr;
currPtr = currPtr->left;
}
if(prevPtr) prevPtr->left = currPtr->right;
// inorder successor
return currPtr;
}
Der Code oben fehlt der Fall hier der Baum hat nur einen Knoten, der Root-Knoten, wird es nicht richtig funktionieren und es auch nicht überprüfen, ob der Baum hat keine Knoten überhaupt, aber es funktioniert, wenn ein Baum hat ein paar Knoten.
Wie kann ich also die notwendigen Zeiger auf der else if
für die Löschung des Knotens? Denken Sie auch daran, dass die left
y right
Zeiger auf die Baumknoten werden immer irgendwo hinzeigen oder NULL
.
Übrigens, ich möchte das iterativ machen.