C ++ legato ricerca binaria albero (DeleteTree)

voti
0

Devo implementare un albero binario di ricerca in C ++ per una delle assegnazioni. Ho creato la classe, e cercato di attuare l'InsertItem, StampaAlberoPre, DeleteTree metodi per la classe, credo di aver fatto tutto giusto, ma per qualche motivo il mio programma blocca di continuo :(

Ecco il mio codice:

Metodo StampaAlberoPre

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);
}

Metodo 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;
}

La mia sequenza di chiamate di metodo fino agli crash del programma:

Inserisco elementi F,B,G,A,D,I,C,E,H: funziona bene

Chiamo PrintTree(): funziona bene

Chiamo DeleteTree(): funziona bene

Chiamo PrintTree()di nuovo: programma si blocca

Per qualche motivo l'espressione if(RootNode == NULL)non restituisce vero dopo che il DeleteTree()metodo viene chiamato, in modo che il programma tenta di stampare qualcosa che non esiste e va in crash. Io non sono sicuro perché questo sta accadendo, cosa sto facendo male qui?

C'è ne e tutto l'aiuto è apprezzato.

È pubblicato 07/11/2011 alle 23:16
fonte dall'utente
In altre lingue...                            


2 risposte

voti
2

Calling "delete" non nullo il puntatore. Si vuole fare:

delete Node; 
Node = nullptr;

MODIFICARE:

Passare il puntatore per indirizzo in modo da poter ripulire penzoloni puntatori, come si va:

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);
Risposto il 07/11/2011 a 23:20
fonte dall'utente

voti
2

Penso che la funzione di cancellazione deve essere modificato in seguito,

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

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

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

Perfavore, correggimi se sbaglio.

Risposto il 07/11/2011 a 23:28
fonte dall'utente

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