Différence entre deux algorithmes récursifs pour supprimer un arbre de recherche binaire

voix
0

J'ai une question au sujet de ces deux algorithmes:

Cela fonctionne normalement:

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

Ce Nope:

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

Pourquoi? Je dois régler la rootpour de nullsorte que le pointeur de nœud après la suppression du BST ne pointera pas à une mémoire non allouée. Je préfère le second algorithme , car le rappel de la fonction est plus intuitive.

En théorie, les deux algorithmes sont équivalents, mais si j'utilise le second algorithme et je tente d'imprimer le BST, le programme va dans une boucle.

Créé 14/04/2017 à 11:35
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
2

Lorsque vous avez node *rootet attribuez node = NULLcela n'affectera sa valeur extérieure. Si vous souhaitez modifier la valeur de pointeur, vous devrez passer un double pointeur.

Quelque chose comme:

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

Mais je ne pense pas vraiment que vous devez affecter node = NULLpuisque vous libérer. Ainsi, vous pouvez simplement attribuer une node = NULLfois que vous appelez deleteTree et vous aurez pas besoin de désordre avec double pointeur.

Créé 14/04/2017 à 11:47
source utilisateur

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