C ++ połączone drzewo binarne wyszukiwania (DeleteTree)

głosy
0

Muszę wdrożyć binarne drzewo wyszukiwania przy użyciu C ++ dla jednego z zadań. I utworzeniu klasy, i próbowali realizować InsertItem, PrintTree, DeleteTree metody klasy, myślę, że zrobiłem wszystko dobrze, ale z jakiegoś powodu mój program się zawiesza :(

Tu jest mój kodu:

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

Moja metoda zwraca ciąg aż do awarii programu:

Wstawić elementy F,B,G,A,D,I,C,E,H: działa dobrze

Wzywam PrintTree(): działa dobrze

Wzywam DeleteTree(): działa dobrze

Zadzwonię PrintTree()jeszcze raz: awarie programu

Z jakiegoś powodu wyrażenie if(RootNode == NULL)nie wraca po prawdziwy DeleteTree()metoda jest wywoływana, więc program próbuje wydrukować coś, co nie istnieje i awarii. Nie jestem pewien, dlaczego tak się dzieje, co robię źle tutaj?

Będziemy wdzięczni za każdą pomoc.

Utwórz 07/11/2011 o 23:16
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
2

Wywołanie „delete” nie NULL się wskaźnik. Będziemy chcieli zrobić:

delete Node; 
Node = nullptr;

EDYTOWAĆ:

Przepuścić przez wskaźnik adresu, aby można było oczyścić zwisające wskazówek jak przejść:

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);
Odpowiedział 07/11/2011 o 23:20
źródło użytkownik

głosy
2

Myślę, że funkcja kasowania powinna zostać zmieniona na następujących,

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

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

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

Proszę, popraw mnie jeśli się mylę.

Odpowiedział 07/11/2011 o 23:28
źródło użytkownik

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