arbre de recherche binaire lié C ++ (DeleteTree)

voix
0

Je dois mettre en place un arbre de recherche binaire en utilisant C ++ pour l' une des missions. J'ai créé la classe, et a tenté de mettre en œuvre le InsertItem, PrintTree, DeleteTree méthodes de la classe, je pense que je l'ai fait tout droit , mais pour une raison quelconque mon programme se bloque continuellement :(

Voici mon code:

Méthode 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);
}

Méthode 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;
}

Ma séquence de méthode appelle jusqu'à ce que le programme se bloque:

Insérer des éléments F,B,G,A,D,I,C,E,H: fonctionne très bien

J'appelle PrintTree(): fonctionne très bien

J'appelle DeleteTree(): fonctionne très bien

Je demande à PrintTree()nouveau: plante programme

Pour une raison quelconque l'expression if(RootNode == NULL)ne renvoie pas vrai après la DeleteTree()méthode est appelée, de sorte que le programme tente d'imprimer quelque chose qui n'existe pas et se bloque. Je ne sais pas pourquoi cela se passe, ce que je fais mal ici?

Toute aide est appréciée.

Créé 07/11/2011 à 23:16
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Appel « supprimer » ne pas null le pointeur. Vous voulez faire:

delete Node; 
Node = nullptr;

MODIFIER:

Passez le pointeur par adresse afin que vous puissiez nettoyer des pointeurs ballants comme vous allez:

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);
Créé 07/11/2011 à 23:20
source utilisateur

voix
2

Je pense qu'il faut changer la fonction de suppression de ce qui suit,

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

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

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

S'il vous plait corrigez moi si je me trompe.

Créé 07/11/2011 à 23:28
source utilisateur

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