C ++ που συνδέονται δέντρο δυαδικής αναζήτησης (DeleteTree)

ψήφοι
0

Θα πρέπει να εφαρμόσει ένα δυαδικό δέντρο αναζήτησης με χρήση C ++ για μία από τις αναθέσεις. Έχω δημιουργήσει την τάξη, και προσπάθησε να εφαρμόσει την insertItem, PrintTree, DeleteTree μεθόδους για την κατηγορία, νομίζω ότι έκανα τα πάντα σωστά, αλλά για κάποιο λόγο το πρόγραμμά μου κρατά συντρίβεται :(

Εδώ είναι κωδικός μου:

Μέθοδος PrintTree

template <class TItem>
void BinarySearchTree<TItem>::PrintTree()
{
    PrintTree(RootNode);
}

template <class TItem>
void BinarySearchTree<TItem>::PrintTree(BinarySearchTreeNode* Node)
{
    if(Node == NULL)
        return;

    cout << Node->Data << endl;
    PrintTree(Node->LeftChild);
    PrintTree(Node->RightChild);
}

Μέθοδος DeleteTree

template <class TItem>
void BinarySearchTree<TItem>::DeleteTree()
{
    DeleteTree(RootNode);
}

template <class TItem>
void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode* Node)
{
    if(Node == NULL)
        return;

    DeleteTree(Node->LeftChild);
    DeleteTree(Node->RightChild);

    delete Node;
}

σειρά μου της μεθόδου απαιτεί μέχρι τις συντριβές προγράμματος:

Εισάγω στοιχεία F,B,G,A,D,I,C,E,H: δουλεύει μια χαρά

Καλώ PrintTree(): δουλεύει μια χαρά

Καλώ DeleteTree(): δουλεύει μια χαρά

Καλώ PrintTree()και πάλι: το πρόγραμμα διακόπτεται

Για κάποιο λόγο η έκφραση if(RootNode == NULL)δεν επιστρέφει αληθές αφού η DeleteTree()μέθοδος ονομάζεται, έτσι ώστε το πρόγραμμα προσπαθεί να εκτυπώσετε κάτι που δεν υπάρχει και κολλάει. Δεν είμαι σίγουρος γιατί συμβαίνει αυτό, τι κάνω λάθος εδώ;

Οποιαδήποτε και όλες βοήθεια είναι ευπρόσδεκτη.

Δημοσιεύθηκε 07/11/2011 στις 23:16
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
2

Κλήση «διαγραφή» δεν null από το δείκτη. Θα ήθελα να κάνω:

delete Node; 
Node = nullptr;

ΕΠΕΞΕΡΓΑΣΙΑ:

Περάστε το δείκτη του διεύθυνση, έτσι ώστε να μπορεί να καθαρίσει κρέμονται δείκτες as you go:

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);
Απαντήθηκε 07/11/2011 στις 23:20
πηγή χρήστη

ψήφοι
2

Νομίζω ότι η λειτουργία διαγραφής πρέπει να αλλάξει στην επόμενη,

template <class TItem>
void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode** Node)
{
    if((*Node) == NULL)
        return;

    DeleteTree(&(*Node)->LeftChild);
    DeleteTree(&(*Node)->RightChild);

    delete (*Node);
    (*Node) = NULL;
}

Παρακαλώ διορθώστε με αν κάνω λάθος.

Απαντήθηκε 07/11/2011 στις 23:28
πηγή χρήστη

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