Rozdíl mezi dvěma rekurzivních algoritmů pro vymazání binární vyhledávací strom

hlasů
0

Mám dotaz týkající se těchto dvou algoritmů:

To funguje normálně:

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

To ani náhodou:

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

Proč? Musím nastavit root, aby nulltak uzel ukazatel po odstranění z BST nebude odkazovat na paměť není přidělena. Dávám přednost druhý algoritmus, protože odvolání z funkce je více intuitivní.

Teoreticky by tyto dva algoritmy jsou rovnocenné, ale pokud mohu použít druhý algoritmus a snažím se vytisknout BST, program přejde do smyčky.

Položena 14/04/2017 v 11:35
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Když máte node *roota přiřadit node = NULLto nebude mít vliv na její hodnotu v exteriéru. Chcete-li změnit hodnotu ukazatele, budete muset projít dvojí ukazatel.

Něco jako:

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

Ale nemyslím, opravdu myslíte, že je třeba přiřadit node = NULL, protože jej uvolnit. Takže stačí přiřadit node = NULLpo volání deleteTree a nebudete potřebovat, aby si s dvojitým ukazatelem.

Odpovězeno 14/04/2017 v 11:47
zdroj uživatelem

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