C ++ связано бинарное дерево поиска (DeleteTree)

голоса
0

Я должен реализовать бинарное дерево поиска с использованием 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)не возвращает истину после того , как DeleteTree()метод вызывается, поэтому программа пытается напечатать что - то , что не существует и аварий. Я не знаю , почему это происходит, что я здесь делаю неправильно?

Любые и вся помощь оценена.

Задан 07/11/2011 в 23:16
источник пользователем
На других языках...                            


2 ответов

голоса
2

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

delete Node; 
Node = nullptr;

РЕДАКТИРОВАТЬ:

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

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);
Ответил 07/11/2011 в 23:20
источник пользователем

голоса
2

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

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

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

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

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

Ответил 07/11/2011 в 23:28
источник пользователем

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