Differenza tra due algoritmi ricorsivi per eliminare un albero binario di ricerca

voti
0

Ho una domanda di questi due algoritmi:

Questo funziona normalmente:

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

Questo no:

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

Perché? Devo impostare il rootal nullmodo che l'indicatore nodo dopo l'eliminazione del BST non punterà ad una memoria non allocata. Io preferisco il secondo algoritmo perché il richiamo della funzione è più intuitivo.

In teoria, i due algoritmi sono equivalenti, ma se uso il secondo algoritmo e cerco di stampare il BST, il programma va in un ciclo.

È pubblicato 14/04/2017 alle 11:35
fonte dall'utente
In altre lingue...                            


1 risposte

voti
2

Quando si dispone node *roote assegnare node = NULLnon influenzerà il suo valore in esterno. Se si desidera modificare il valore del puntatore, si dovrà passare un doppio puntatore.

Qualcosa di simile a:

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

Ma io non credo è necessario assegnare node = NULLin quanto si liberarlo. Così, si può semplicemente assegnare node = NULLdopo aver chiamato deleteTree e non avrete bisogno di pasticciare con doppio puntatore.

Risposto il 14/04/2017 a 11:47
fonte dall'utente

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