Der Unterschied zwischen zwei rekursive Algorithmen eines binären Suchbaum löschen

stimmen
0

Ich habe eine Frage über diese beiden Algorithmen:

Dies funktioniert in der Regel:

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

Diese Nö:

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

Warum? Ich muß zum Einstellen des rootzu nullso der Knotenzeiger nach dem Löschen des BST wird nicht nicht zugeordnet auf einen Speicher verweisen. Ich ziehe den zweiten Algorithmus , da der Rückruf der Funktion intuitiver ist.

Theoretisch sind die beiden Algorithmen gleichwertig, aber wenn ich den zweiten Algorithmus verwenden und ich versuche, die BST zu drucken, geht das Programm in einer Schleife.

Veröffentlicht am 14/04/2017 um 11:35
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
2

Wenn Sie node *rootund weisen Sie node = NULLes nicht seinen Wert in Außen beeinflussen. Wenn Sie den Mauszeiger Wert ändern möchten, werden Sie ein Doppelzeiger übergeben.

Etwas wie:

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

Aber ich glaube nicht wirklich , was Sie brauchen zuweisen , node = NULLda Sie es befreien. So können Sie nur zuordnen , node = NULLnachdem Sie deleteTree anrufen und Sie werden nicht mit Doppelzeiger zu verwirren müssen.

Beantwortet am 14/04/2017 um 11:47
quelle vom benutzer

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