C ++ kapcsolt bináris keresési fa (DeleteTree)

szavazat
0

Meg kell végre bináris kereső fába C ++ az egyik feladatokat. Létrehoztam az osztályban, és megpróbálta megvalósítani a InsertItem, PrintTree, DeleteTree módszerek az osztályban, azt hiszem, mindent jól, de valamiért a program megtartja összeomlik :(

Itt a kód:

PrintTree eljárás

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 eljárás

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

Saját sorozata metódushívások ig programösszeomlások:

Beszúrni példány F,B,G,A,D,I,C,E,H: jól működik

Hívom PrintTree(): jól működik

Hívom DeleteTree(): jól működik

Hívom PrintTree()újra: a program összeomlik

Valamilyen oknál fogva a kifejezés if(RootNode == NULL)nem tér vissza true után DeleteTree()módszert nevezik, így a program megpróbál nyomtatni valamit, ami nem létezik, és összeomlik. Nem vagyok benne biztos, hogy ez miért történik, mit csinálok rosszul van?

Bármely és minden segítséget előre is köszönjük.

A kérdést 07/11/2011 23:16
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
2

Calling „törlés” nem null ki a mutatót. Lesz akar csinálni:

delete Node; 
Node = nullptr;

EDIT:

Pass a mutatót címét, így megtisztíthatja lelógó mutatókat, ahogy megy:

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);
Válaszolt 07/11/2011 23:20
a forrás felhasználó

szavazat
2

Azt hiszem, a törlés funkciót meg kell változtatni, hogy a következő,

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

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

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

Kérem javítson ki, ha tévedek.

Válaszolt 07/11/2011 23:28
a forrás felhasználó

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