Forskjellen mellom to rekursive algoritmer for å slette et binært søketre

stemmer
0

Jeg har et spørsmål om disse to algoritmer:

Dette fungerer normalt:

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

Dette nope:

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

Hvorfor? Jeg må sette roottil nullså noden pekeren etter slettingen av BST vil ikke peke på et minne som ikke er tildelt. Jeg foretrekker den andre algoritmen fordi tilbakekalling av funksjonen er mer intuitiv.

Teoretisk de to algoritmer er tilsvarende, men hvis jeg bruker den andre algoritmen og jeg prøver å skrive ut BST, går programmet i en sløyfe.

Publisert på 14/04/2017 klokken 11:35
kilden bruker
På andre språk...                            


1 svar

stemmer
2

Når du har node *rootog gi node = NULLdet vil ikke påvirke sin verdi i eksteriør. Hvis du ønsker å endre pekeren verdi, må du passere en dobbel pekeren.

Noe som:

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

Men jeg egentlig ikke tror du trenger å tildele node = NULLsiden du frigjøre den. Så kan du bare tildele node = NULLetter at du ringer deleteTree og du trenger ikke å rote med dobbel pekeren.

Svarte 14/04/2017 kl. 11:47
kilden bruker

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