C ++ propojen binární vyhledávací strom (DeleteTree)

hlasů
0

Musím zavést strom binárního vyhledávání pomocí jednoho z úkolů C ++. Vytvořil jsem třídu, a pokoušel se realizovat InsertItem, PrintTree, DeleteTree metody pro třídu, myslím, že jsem udělal všechno správně, ale z nějakého důvodu můj program udržuje shazovat :(

Tady je můj kód:

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

Můj posloupnost volání metod až do havárie programu:

I vložit položky F,B,G,A,D,I,C,E,H: funguje

Říkám PrintTree(): funguje

Říkám DeleteTree(): funguje

Říkám PrintTree()znovu: zhroucení programu

Z nějakého důvodu výraz if(RootNode == NULL)nevrací platí po DeleteTree()volání metody, takže program se pokusí tisknout něco, co neexistuje, a dojde k chybě. Nejsem si jistý, proč se to děje, co dělám špatně?

Veškeré pomoc je oceňována.

Položena 07/11/2011 v 23:16
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Volání „vymazat“ není null ven ukazatel. Budete chtít udělat:

delete Node; 
Node = nullptr;

UPRAVIT:

Předat ukazatel podle adresy, takže můžete vyčistit houpající ukazovátka as you go:

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);
Odpovězeno 07/11/2011 v 23:20
zdroj uživatelem

hlasů
2

Myslím, že odstranění funkce by měl být změněn na následující,

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

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

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

Prosím, opravte mě, jestli se mýlím.

Odpovězeno 07/11/2011 v 23:28
zdroj uživatelem

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