Diferența între doi algoritmi recursive pentru a șterge un arbore binar de căutare

voturi
0

Am o întrebare cu privire la acești doi algoritmi:

Acest lucru funcționează în mod normal:

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

Acest nope:

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

De ce? Am nevoie pentru a seta rootla nullastfel încât indicatorul de nod după ștergerea a BST nu va indica o memorie nu sunt alocate. Eu prefer al doilea algoritm , deoarece retragerea funcției este mai intuitiv.

Teoretic, cei doi algoritmi sunt echivalente, dar dacă am folosi de-al doilea algoritm și încerc să imprimați BST, programul merge într-o buclă.

Întrebat 14/04/2017 la 11:35
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
2

Când aveți node *rootși să alocați node = NULLnu va afecta valoarea sa în exterior. Dacă doriți să modificați valoarea indicatorului, va trebui să treacă un pointer dublu.

Ceva asemănător cu:

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

Dar eu nu cred că într - adevăr trebuie să alocați de node = NULLcând ai elibera. Deci, aveți posibilitatea să atribuiți doar node = NULLdupă ce suna deleteTree și nu va fi nevoie să te pui cu dublu indicator.

Publicat 14/04/2017 la 11:47
sursa de către utilizator

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