İkili arama ağacı silme (Inorder Pred yöntemi) C ++

oy
1

Tamam bu yüzden sabit olduğunu düşündüm, ama tamamen tutarsız sonuçlar alıyorum. Taze başlatmak için sıfırdan tür yeniden yazdım ve burada benim sonuçlarıdır. Ben hiç hata yok, ölmek üzere olsun, sadece bunları kaldırmaz. Sadece tamamen ağaca messes ve bana bir ton daha yaprakları verir ve her şeyi birbirine karıştırır. gidecek başka emin değil

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;
    }
Oluştur 29/10/2008 saat 05:56
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
0

Sen çağıran edilmemelidir remove()(sizin "Bunun doğru olduğuna emin değilim" yorum olduğu) üçüncü durumda yinelemeli. Kaldırmak için düğüm iki çocuğu var durumda, ne yapmak istediğiniz sol çocuğun en sağdaki çocuk bulmak (yapıyorsun olarak; Elde düğüm depolanır parent). Bu düğüm hiçbir doğru çocuğu var - sağ alt Silinecek düğümün sağ çocuğu olacak şekilde bunu yapmak. Sonra sadece değiştirmek rootsol çocuk olmak değişken; Hiçbir değiştirmeniz gerekir dataherhangi düğümlerinde üyesi veya aramaya removeyinelemeli.

Resimlerde:

Önce:
         r <- burada kök noktaları
       / \
      / \
     ab
    / \ / \
   xcyy
      / \
     xd
        /
       x

Sonra:
      a <- burada kök noktaları
     / \
    xc
       / \
      xd
         / \
        xb
           / \
          yy
Cevap 29/10/2008 saat 06:22
kaynak kullanıcı

oy
0

Her T eşsiz ağacında bulunur? bunlar kodundan vardır gibi görünüyor ...

Bu çalışması gerekir gibi görünüyor:

Başka bir durumda kök düğümü silme:

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;
Cevap 29/10/2008 saat 06:57
kaynak kullanıcı

oy
1

Ne aslında oluyordu aslında sadece sağ devam ediyorum böylece kudreti aramalar tersine dönmüş ancak veri gerçekten doğru uymayan ve bu yüzden öyle görünüyor bir duvar vururdu olduğunu.

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

olmalıydı

if(x < root->data)
remove(root->left, x);
else
remove(root->right, x);
Cevap 29/10/2008 saat 08:09
kaynak kullanıcı

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