Különbség a két rekurzív algoritmusok törölni egy bináris keresési fa

szavazat
0

Van egy kérdés két algoritmus:

Ez normálisan működik:

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

Ez dehogy:

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

Miért? Meg kell állítani a roothogy nullígy a csomópont mutató után a törlés a BST nem utalnak arra, hogy a memória nem osztottak. Inkább a második algoritmus miatt visszahívja a funkció intuitív.

Elméletileg, a két algoritmus ekvivalens, de ha csak a második algoritmus és nyomtatni próbálok a BST, a program megy a hurok.

A kérdést 14/04/2017 11:35
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
2

Ha van node *root, és hozzá node = NULLez nem befolyásolja az értékét a külseje. Ha módosítani szeretné a mutató értéke, akkor meg kell felelnie a kettős mutatót.

Valami hasonló:

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

De én nem igazán hiszem, meg kell rendelni node = NULL, mert akkor kiszabadítani. Tehát, ha csak rendelni node = NULLután hívja deleteTree és akkor nem kell bajlódni a kettős mutatóval.

Válaszolt 14/04/2017 11:47
a forrás felhasználó

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