Binärer Suchbaum Löschen (Inorder Pred-Methode) C ++

stimmen
1

Ok, so dachte ich, es wurde festgelegt, aber ich bin immer völlig inkonsistente Ergebnisse. Ich schrieb es Art von Grund auf neu zu beginnen und hier sind meine Ergebnisse. Ich habe keine Fehler auftreten, kein Krachen, es nicht entfernen Sie sie nicht. Es verwirrt gerade total auf den Baum und gibt mir eine Tonne mehr Blätter, und mischt sich alles auf. Nicht sicher, wo sonst zu gehen

template <class T>
void BST<T>::remove(struct Node<T>*& root, const T& x)
{
   Node<T>* ptr = root;
   bool found = false;
   Node<T>* parent;


   while (ptr != NULL && !found)
   {
       if (x < ptr->data)
       {
           parent = ptr;
           ptr = ptr->left;
       }
       else if (x > ptr->data)
       {
           parent = ptr;
           ptr = ptr->right;
       }
       else
           found = true;
   }

   if (found == false)
       return;
   else
   {
       if(ptr->left != NULL && ptr->right != NULL)
       {
           Node<T>* inOrderPtr = ptr->left;
           parent = ptr;
           while (inOrderPtr->right != NULL)
           {
               parent = inOrderPtr;
               inOrderPtr = inOrderPtr->right;
           }

           ptr->data = inOrderPtr->data;
           ptr = inOrderPtr;
       }
    Node<T>* subPtr = ptr->left;
    if (subPtr == NULL)
        subPtr = ptr->right;

    else if (parent->left == ptr)
        parent->left = subPtr;

    else
        parent->right = subPtr;

    delete ptr;
    }
Veröffentlicht am 29/10/2008 um 05:56
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

Sie sollten anrufen nicht remove()rekursiv im dritten Fall (wo Ihr „ ist nicht sicher , ob dies richtig ist“ Kommentar ist). In dem Fall , in dem die die Knoten zu entfernen , zwei Kinder haben, was Sie tun möchten , ist das am weitesten rechts stehende Kind des linken Kindes finden (wie Sie tun, der resultierende Knoten gespeichert in parent). Dieser Knoten hat kein Recht , Kind - es so machen, dass sein rechtes Kind das rechte Kind des Knotens gelöscht werden. Dann einfach den ändert rootVariable sein linkes Kind zu sein; keine Notwendigkeit , das zu ändern dataMitglied in beliebigen Knoten oder ruft removerekursiv.

In Bildern:

Vor:
         r <- Fußpunkte hier
       / \
      / \
     ab
    / \ / \
   xcyy
      / \
     xd
        /
       x

Nach:
      a <- Fußpunkte hier
     / \
    xc
       / \
      xd
         / \
        xb
           / \
          yy
Beantwortet am 29/10/2008 um 06:22
quelle vom benutzer

stimmen
0

Jeweils T in Baum eindeutig gefunden? Es sieht aus wie sie aus dem Code sind ...

Es sieht aus wie das funktionieren soll:

Im anderen Fall das Löschen des Root-Knoten:

Node<T> *tmp_r = root->left;
Node<T> *parent = root;
while (tmp_r->right != NULL)
{
    parent = tmp_r;
    tmp_r = tmp_r->right;
}
Node<T> *tmp_l = tmp_r;
while (tmp_l->left != NULL)
    tmp_l = tmp_l->left;

tmp_l->left = root->left;
tmp_r->right = root->right;
parent->right = NULL;

parent = root;
root = tmp_r;
delete parent;
Beantwortet am 29/10/2008 um 06:57
quelle vom benutzer

stimmen
1

Was tatsächlich geschieht, ist, dass die Macht sucht umgekehrt wären, so wäre es nur tatsächlich hält richtig abgeht, aber die Daten nicht wirklich passend richtig und so wäre es eine Wand schlägt es scheint.

if (root->data < x)
        remove(root->left, x);
    else 
        remove(root->right, x);

gewesen sein sollte

if(x < root->data)
remove(root->left, x);
else
remove(root->right, x);
Beantwortet am 29/10/2008 um 08:09
quelle vom benutzer

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