C ++ связанное двоичное дерево поиска (DeleteTree) - PullRequest
0 голосов
/ 08 ноября 2011

Я должен реализовать двоичное дерево поиска, используя C ++ для одного из назначений.Я создал класс и попытался реализовать методы InsertItem, PrintTree, DeleteTree для класса, я думаю, что все сделал правильно, но по какой-то причине моя программа продолжает падать: (

Вот мой код:

Метод 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);
}

Метод 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;
}

Моя последовательностьметод вызывается до тех пор, пока не произойдет сбой программы:

Я вставляю элементы F,B,G,A,D,I,C,E,H: отлично работает

Я звоню PrintTree(): отлично работает

Я звоню DeleteTree(): отлично работает

Я звоню PrintTree() снова: сбой программы

Дляпо какой-то причине выражение if(RootNode == NULL) не возвращает true после вызова метода DeleteTree(), поэтому программа пытается напечатать что-то, что не существует, и вылетает. Я не уверен, почему это происходит, что я делаю неправильноздесь?

Любая и вся помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

Я думаю, что функция удаления должна быть изменена на следующее,

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

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

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

Пожалуйста, поправьте меня, если я ошибаюсь.

2 голосов
/ 08 ноября 2011

Вызов «delete» не отменяет указатель. Вам захочется сделать:

delete Node; 
Node = nullptr;

EDIT:

Передайте указатель по адресу, чтобы вы могли убирать висячие указатели по ходу:

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);
...