İki özyinelemeli algoritmalar arasındaki fark bir ikili arama ağacı silme

oy
0

Bu iki algoritma hakkında bir sorum var:

Bu normalde çalışır:

node* deleteTree(node* root)
{
    if(root != NULL)
    {
       deleteTree(root->left);
       deleteTree(root->right);
       deallocateNode(root);
    }
    return root=NULL;
}

Bu hayır:

void deleteTree(node* root)
{
   if(root != NULL)
   {
      deleteTree(root->left);
      deleteTree(root->right);
      deallocateNode(root);
   }
   root=NULL;
}

Niye ya? Ben ayarlamanız gerekir rootiçin nullöylesine BST'nin silme sonra düğüm işaretçi değil ayrılmış bir belleğe işaret olmayacaktır. Fonksiyonun geri çağırma daha sezgisel olduğu için ikinci algoritma tercih ederim.

Teorik olarak, iki algoritmaları eşdeğerdir ancak ikinci algoritma kullanıyoruz ve ben BST yazdırmaya çalışırsanız, program bir döngü içinde gider.

Oluştur 14/04/2017 saat 11:35
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
2

Eğer varsa node *rootve atamak node = NULLbunun dış onun değerini etkilemez. Eğer işaretçi değerini değiştirmek isterseniz, bir çift işaretçi geçmesi gerekecek.

Gibi bir şey:

void deleteTree(node** root)
{
   if(*root != NULL)
   {
      deleteTree(&((*root)->left));
      deleteTree(&((*root)->right));
      deallocateNode(*root);
   }
   *root = NULL;
}

Ama gerçekten atamak gerekir sanmıyorum node = NULLsiz serbest beri. Yani, sadece atayabilirsiniz node = NULLEğer deleteTree arayıp, çift pointer ile karışıklık gerekmez sonra.

Cevap 14/04/2017 saat 11:47
kaynak kullanıcı

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