Verschil tussen twee recursieve algoritmes om een ​​binaire zoekboom verwijderen

stemmen
0

Ik heb een vraag over deze twee algoritmen:

Dit werkt normaal:

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

Dit nope:

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

Waarom? Ik moet stellen het rootop null, zodat het knooppunt wijzer na het verwijderen van de BST zal niet wijzen op een geheugen niet toegewezen. Ik geef de voorkeur de tweede algoritme, omdat het terugroepen van de functie is meer intuïtief.

Theoretisch, de twee algoritmen zijn gelijkwaardig, maar als ik de tweede algoritme te gebruiken en ik probeer om de BST af te drukken, gaat het programma in een lus.

De vraag is gesteld op 14/04/2017 om 11:35
bron van user
In andere talen...                            


1 antwoorden

stemmen
2

Wanneer u node *rooten wijs node = NULLzal het niet van invloed op de waarde ervan in exterieur. Als u wilt dat de pointer waarde te wijzigen, moet u een dubbele pointer passeren.

Zoiets als:

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

Maar ik denk niet echt dat je nodig hebt om toe te wijzen node = NULL, omdat je het te bevrijden. Dus, kun je gewoon toewijzen node = NULLnadat u deleteBoom bellen en je hoeft niet te knoeien met dubbele pointer.

antwoordde op 14/04/2017 om 11:47
bron van user

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