C ++ legat binar de căutare arbore (DeleteTree)

voturi
0

Am să pună în aplicare un arbore binar de căutare folosind C ++ pentru una dintre misiuni. Am creat clasa, și a încercat să pună în aplicare InsertItem, PrintTree, DeleteTree metode de clasă, cred că am făcut totul bine , dar dintr- un motiv programul meu păstrează crashing :(

Iată codul meu:

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

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

secventa mea de metoda de apeluri până la blocarea programelor:

Inserez elemente F,B,G,A,D,I,C,E,H: funcționează bine

Fac apel PrintTree(): funcționează bine

Fac apel DeleteTree(): funcționează bine

Fac apel PrintTree()din nou: program se blochează

Din anumite motive , expresia if(RootNode == NULL)nu se întoarce adevărat după DeleteTree()metoda este numit, astfel încât programul încearcă să imprime ceva ce nu există și se blochează. Nu sunt sigur de ce acest lucru se întâmplă, ce fac greșit aici?

Orice și toate ajutor este apreciat.

Întrebat 07/11/2011 la 23:16
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
2

Apelarea „șterge“ nu null afară indicatorul. Veți dori să faceți:

delete Node; 
Node = nullptr;

EDITAȚI | ×:

Treceți indicatorul de adresă, astfel încât să puteți curăța atârnând indicii ca te duci:

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);
Publicat 07/11/2011 la 23:20
sursa de către utilizator

voturi
2

Cred că funcția de ștergere ar trebui să fie schimbat la următoarele,

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

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

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

Vă rugăm să corectați-mă dacă mă înșel.

Publicat 07/11/2011 la 23:28
sursa de către utilizator

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