Binar de căutare arbore de ștergere (metoda Inorder Pred) C ++

voturi
1

Ok, așa că am crezut că a fost stabilit, dar eu sunt obtinerea de rezultate total inconsistente. L-am rescris un fel de la zero pentru a începe proaspete și aici sunt rezultatele mele. Nu primesc nici erori, nici un prăpăd, pur și simplu nu le elimina. Doar incurca cu totul copacul și dă-mi o tona mai multe frunze, și amestecă totul. Nu sunt sigur unde altundeva să meargă

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;
    }
Întrebat 29/10/2008 la 05:56
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
0

Nu ar trebui să fie de asteptare remove()recursiv , în al treilea caz ( în cazul în care dvs. „nu sunt sigur dacă acest lucru este drept“ comentariu este). În cazul în care nodul pentru a elimina are doi copii, ceea ce doriți să faceți este să găsească cea mai din dreapta copil al copilului din stânga ( în timp ce faci, nodul rezultat este stocat în parent). Acest nod nu are nici un copil drept - face astfel încât copilul său drept este copilul drept al nodului care urmează să fie șters. Apoi , doar schimba rootvariabila pentru a fi copilul său stâng; Nu este nevoie să modificați dataelementul în orice noduri sau pentru a apela removerecursiv.

În imagini:

Inainte de:
         r <- puncte rădăcină aici
       / \
      / \
     ab
    / \ / \
   xcyy
      / \
     xd
        /
       X

După:
      a <- puncte de rădăcină aici
     / \
    xc
       / \
      xd
         / \
        Xb
           / \
          yy
Publicat 29/10/2008 la 06:22
sursa de către utilizator

voturi
0

Sunt fiecare T găsit în copac unic? Se pare ca acestea sunt de la codul ...

Se pare că acest lucru ar trebui să funcționeze:

În cazul altfel ștergerea nodului rădăcină:

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;
Publicat 29/10/2008 la 06:57
sursa de către utilizator

voturi
1

Ceea ce de fapt se întâmplă este că s-ar putea căutările au fost inversate, astfel că ar fapt doar să păstreze merge bine, dar datele nu au fost într-adevăr se potrivesc în mod corect și așa ar lovi un zid se pare.

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

ar fi fost

if(x < root->data)
remove(root->left, x);
else
remove(root->right, x);
Publicat 29/10/2008 la 08:09
sursa de către utilizator

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