Różnica między dwoma rekurencyjnych algorytmów usunąć wyszukiwania binarne drzewo

głosy
0

Mam pytanie na temat tych dwóch algorytmów:

To działa normalnie:

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

Ten nope:

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

Czemu? Muszę ustawić rootsię nulltak wskaźnik węzeł po usunięcia z BST nie będzie wskazywać na pamięć nie przydzielone. Wolę drugi algorytm ponieważ odzyskanie funkcji jest bardziej intuicyjne.

Teoretycznie oba algorytmy są równoważne, ale jeśli użyć drugiego algorytmu i próbuję wydrukować BST, program przechodzi w pętli.

Utwórz 14/04/2017 o 11:35
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
2

Gdy masz node *rooti przypisać node = NULLto nie wpłynie na jej wartość w powierzchowności. Jeśli chcesz zmodyfikować wartość wskaźnika, musisz zdać podwójny wskaźnik.

Coś jak:

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

Ale ja naprawdę nie sądzę, trzeba przypisać node = NULLponieważ uwolnić go. Tak, można przypisać tylko node = NULLpo wywołaniu deleteTree i nie trzeba zadzierać z podwójnym wskaźnikiem.

Odpowiedział 14/04/2017 o 11:47
źródło użytkownik

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