ikili arama ağacında Silme

oy
0

Bu yüzden, ikili arama ağacında silme ben yani gibi 7 farklı durumlarda olması gerekir ne zaman

  1. Sol Yaprak;
  2. Sağ Yaprak;
  3. Sadece sol çocukla çocuk bıraktı. // silinecek düğüm bunun sol çocuğudur ebeveyn var yani ve sadece çocuğu bırakmıştır.
  4. Sadece sağ çocukla Çocuk bıraktı.
  5. Sadece sol çocukla Sağ çocuğu.
  6. Sadece sağ çocukla Sağ çocuğu.
  7. Düğüm iki çocuk sağ ve sol, yani gelmiştir Silinecek.

Bu kod kullanırken Şimdi if-elseoldukça kötü alır .. Bunu yapmanın başka bir yolu yoktur.

İşte benim kod parçacığı olduğunu

if(current->left==NULL && current->right==NULL && current->key<prev->key)   //left leaf
prev->left=NULL;
else if(current->left==NULL && current->right==NULL && current->key>prev->key) // right     leaf
prev->right=NULL;
else if(current->left!=NULL && current->right==NULL && current->key<prev->key) // left     child with one child
prev->left=current->left;
else if(current->left==NULL && current->right!=NULL && current->key<prev->key)
prev->left=current->right;
else if(current->left!=NULL && current->right==NULL && current->key>prev->key)
prev->right=current->left;
else if(current->left==NULL && current->right!=NULL && current->key>prev->key)
prev->right=current->left;
else if(current->left!=NULL && current->right!=NULL)
{
    check=current->right;
    check1=check;
    while(check->left!=NULL)
    {
    check1=check;
    check=check->left;
    }
    *current=*check;
    check1->left=NULL;
}
Oluştur 30/09/2011 saat 06:10
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
1

boş gösterici silme hiçbir kötü etkisi yoktur. Yani, hiçbir özel durumlarda ile bunu mümkün olmalıdır. Temel kısım sadece geçerli:

delete current->left;
delete current->right;
Cevap 30/09/2011 saat 06:14
kaynak kullanıcı

oy
3

Sen o bundan çok daha basit tutmak ve BST (ikili arama ağacı) bir düğümü silerken sadece üç durumda kendinizi kısıtlayabilirsiniz:

  1. Çocuksuz bir düğüm (bir yaprak): Sadece çıkarın - hiçbir şey özel çaba sarf edilmesi gerektiğini
  2. bir çocuklu bir düğüm: kaldırmak ve onun yerine çocuğu taşımak
  3. iki çocuklu bir düğüm: onun içinde sipariş selefi veya halefi biriyle takas ve sonra çıkarın

Wiki sayfası bu kodda nasıl görüneceğine dair bir örnek içerir.

Veya C çok temel bir örnek olarak:

if (current->left==NULL && current->right==NULL) {
    /* leaf node */
    bst_replace(current, NULL);
}
else if (current->left==NULL || current->right==NULL) {
    /* node with one child */
    bst_replace(current, ((current->left) ? current->left : current->right));
}
else {
    /* node with two children */
    Node* successor = bst_next(current);
    current->data = successor->data;
    bst_replace(successor, successor->right);
}
Cevap 30/09/2011 saat 06:18
kaynak kullanıcı

oy
2

Gerçekten burada silme için kullanılan protokol anlamıyorum. Bir ikili 'arama' ağaç (ağacında hiçbir sipariş) çekmiyorsun.

Ama sadece kod basit hale getirmek için. Böyle bir şey yapabileceğini:

bool b1 = (current->left == NULL);
bool b2 = (current->right == NULL);
bool b3 = (current->key > prev->key);

int decision_case = b1 * 4 + b2 * 2 + b3;

switch(decision_case) {
  case 0: // fill in code here
          break;
  ...
  ...
  case 7: // fill in code here
          break;
}

Ayrıca, kullanması gereken silmek burada bellek sızıntılarını önlemek için. Umarım yardımcı olur.

Cevap 30/09/2011 saat 06:33
kaynak kullanıcı

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