C ++ knyttet binært søketre (DeleteTree)

stemmer
0

Jeg må gjennomføre et binært søketre ved hjelp av C ++ for en av oppgavene. Jeg har opprettet klassen, og forsøkte å gjennomføre InsertItem, PrintTree, DeleteTree metoder for klassen, tror jeg at jeg har gjort alt riktig, men for noen grunn mitt program holder krasj :(

Her er min kode:

PrintTree Method

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 Method

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

Min sekvens av metodekall opp til programkrasj:

Jeg setter elementer F,B,G,A,D,I,C,E,H: fungerer fint

Jeg kaller PrintTree(): fungerer fint

Jeg kaller DeleteTree(): fungerer fint

Jeg kaller PrintTree()igjen: program krasjer

For noen grunn uttrykket if(RootNode == NULL)ikke returnerer sant etter at DeleteTree()metoden kalles, slik at programmet prøver å skrive ut noe som ikke eksisterer og krasjer. Jeg er ikke sikker på hvorfor dette skjer, hva gjør jeg galt her?

Enhver og all hjelp er verdsatt.

Publisert på 07/11/2011 klokken 22:16
kilden bruker
På andre språk...                            


2 svar

stemmer
2

Calling "delete" ikke nulle ut pekeren. Du vil ønske å gjøre:

delete Node; 
Node = nullptr;

REDIGERE:

Før pekeren etter adresse slik at du kan rydde opp dingler pekere som du går:

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);
Svarte 07/11/2011 kl. 22:20
kilden bruker

stemmer
2

Jeg tror slettefunksjonen bør endres til følgende,

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

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

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

Rett meg hvis jeg er galt.

Svarte 07/11/2011 kl. 22:28
kilden bruker

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