Binary Search Tree - Löschen

stimmen
1

Ich versuche, ein Programm zu schreiben, die in Strings nimmt und legt sie in einem binären Suchbaum in alphabetischer Reihenfolge, sobald diese in den Baum eingefügt werden, fordert ein Benutzer für ein Wort gelöscht werden, so dass der Knoten aus dem Baum zu löschen, und dann Ausgabe der Baum ohne diesen Knoten wieder in Ordnung.

Alles für das funktioniert bis zu der Löschfunktion, die Löschfunktion funktioniert, aber es ist sehr seltsam, wie es löscht. Ich denke, dass es derzeit eine volle Seite des Baumes löscht, denn als ich das letzte Wort löschen, es funktioniert in der Regel. Ich werde meine Löschfunktion laden und wenn mehr benötigt wird, kann ich den Rest meines Code laden.

Vielen Dank!

template<typename T> void Delete(TreeNode<T>*& root, const T& data)
{
    if (root == NULL)
        return;
        if(data < root->Value)
            return Delete(root->Left, data);
        else if (root->Value > data)
            return Delete(root->Right, data);
        else
        {
            TreeNode<T>* old_root = root;
            if (root->Left == NULL)
            {
                root = root->Right;
            }
            else if (root->Right == NULL)
            {
                root = root->Left;
            }
            else
            {
                replace_parent(old_root, old_root->Left);
            }
            delete old_root;



    }

};

template<typename T> void replace_parent(TreeNode<T>*& old_root, TreeNode<T>*& root)
{
    if (root->Right != NULL)
    {
        replace_parent(old_root, root->Right);
    }
    else
    {
        old_root->Value = root->Value;
        old_root = root;
        root = root->Left;
    }
};
Veröffentlicht am 31/03/2011 um 03:24
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Ihre Koffer für links oder rechts Wesen NULLsind gut. Jedoch Ihre Logik für weder von ihnen NULList leider versagt.

Wenn ich Ihren Code bin Lesen (und die mit der Funktion replace_parent()korrekt, dann , wenn weder Baum ist leer Sie mit dem aktuellen Root ersetzen Left.

Fragen Sie sich - was zu den Werten geschieht , die in der sind RightTeilbaum?

Was Sie brauchen, um das zu tun einen Knoten zu löschen ist wie folgt:

  1. Geben Sie einen der Unterbäume. Es sieht aus wie Sie sich entschieden haben LeftUnterbaum, so dass wir von dort aus gehen.
  2. Folgen Sie die gegenüberliegende Linie des Zweiges. In diesem Beispiel hält die hinunteren RightTeilbäume von dem Original Left. Fahren Sie bis Sie einen rechten Blattknoten finden (keine RightTeilbäume; Leftist OK)
  3. Denken Sie daran , den Wert Ihrer rechten Flügel in einer tmpVariable.
  4. Bringen Sie das rechte Blatt ist Left(obNULL oder nicht) auf die rechte Blattposition.
  5. Nehmen Sie den tmpWert und legen Sie sie in Ihrem ursprünglichen ‚zu löschen‘ Knoten.
Beantwortet am 31/03/2011 um 03:38
quelle vom benutzer

stimmen
2

Lacqui korrekt in seinen Punkten.

lassen Sie mich Ihnen sagen, dass, während ein Knoten Löschen Sie mit ihm in der linken Unterbaum oder der minimalen Knoten in der rechten Unterbaum entweder der max Knoten ersetzen müssen. zum Beispiel: Wenn Sie das Bild unten zu sehen: Geben Sie hier image description

Wenn Sie den Knoten 90 löschen möchten, müssen Sie darauf achten, dass Sie ersetzen es mit entweder 80, die in der linken Unterbaum oder 92, die den minimalen Knoten in der rechten Unterbaum seine max Knoten ist. Sie können jeden Ansatz halten.

so die algo werden sein: der linke Unterbaum unter Berücksichtigung

-> wenn Sie den Knoten finden zu löschen, navigieren Sie zu dem Maximalwert in dem linken Unterbaum.

-> assign der linken Seite des Knotens als 50 und Knoten rechts 150 zu sein

-> machen 75-> weiter als null und löschen 90

Beantwortet am 18/04/2011 um 11:22
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more