Διαφορά μεταξύ των δύο αναδρομικών αλγορίθμων για να διαγράψετε ένα δυαδικό δέντρο αναζήτησης

ψήφοι
0

Έχω μια ερώτηση σχετικά με αυτές τις δύο αλγορίθμους:

Αυτό λειτουργεί κανονικά:

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

Αυτό nope:

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

Γιατί; Θα πρέπει να ρυθμίσετε το rootσε nullτόσο ο δείκτης του κόμβου μετά τη διαγραφή της BST δεν θα οδηγούν σε μια μνήμη που δεν έχει ανατεθεί. Προτιμώ το δεύτερο αλγόριθμο, διότι η ανάκληση της λειτουργίας είναι πιο διαισθητικό.

Θεωρητικά, οι δύο αλγόριθμοι είναι ισοδύναμες, αλλά αν μπορώ να χρησιμοποιήσω το δεύτερο αλγόριθμο και προσπαθώ να εκτυπώσετε το BST, το πρόγραμμα πηγαίνει σε ένα βρόχο.

Δημοσιεύθηκε 14/04/2017 στις 11:35
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
2

Όταν έχετε node *rootκαι να εκχωρήσετε node = NULLαυτό δεν θα επηρεάσει την αξία του στο εξωτερικό. Αν θέλετε να τροποποιήσετε την τιμή του δείκτη, θα πρέπει να περάσει ένα διπλό δείκτη.

Κάτι όπως:

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

Αλλά εγώ πραγματικά δεν νομίζετε ότι πρέπει να εκχωρήσετε node = NULLαπό τη στιγμή που θα απελευθερώσει. Έτσι, μπορείτε να ορίσετε ακριβώς node = NULLμετά την κλήση deleteTree και δεν θα χρειαστεί να το χάος με διπλό δείκτη.

Απαντήθηκε 14/04/2017 στις 11:47
πηγή χρήστη

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