Я все еще работаю над своими двоичными деревьями, а функции вставки, поиска, максимума и минимума все работают отлично. Поэтому я хочу сделать функцию удаления далее. Я включил стек, который saves- ах ад, я просто показать код:Удаление двоичного дерева с помощью стека
class Tree
{
private:
int value_;
Tree *root_;
Tree *left_;
Tree *right_;
std::stack<Tree*> treeStack;
функции удаления:
int Tree::eraseTree()
{
while(!treeStack.empty())
{
Tree *temp = treeStack.top();
treeStack.pop();
delete temp;
}
if(treeStack.empty())
return 1;
else
return -1;
}
я получаю ошибки в настоящее время. Это не будет проблемой - я пытаюсь отлаживать свой собственный код, за исключением того, что он говорит мне, что в файле библиотеки <deque>
есть ошибка, которую я даже не использую.
Перед тем, как программа отключится, я получаю System.AccessViolationException
, а неисправный код указывает на файл deque
. Конечно, этого не может быть, это должен быть какой-то указатель на мой код. Это заставляет меня поверить, что я неправильно работаю над стеком или неправильно нажимаю на стек.
Что я здесь делаю неправильно? Действительно ли я удаляю узлы, когда я вызываю .pop в стеке?
EDIT:
if(!root_)
{
root_ = new Tree(val, 0, 0);
treeStack.push(root_);
return val;
}
И
Tree *parent = findInsertionPoint(val, root_);
if(val < parent->value_)
parent->left_ = new Tree(val, 0, 0);
else
parent->right_ = new Tree(val, 0,0);
treeStack.push(parent);
return val;
где я толкая свои элементы в стек.
Дополнительный вопрос: Должен ли быть построен std :: стек в ctor?
Я вижу 'eraseTree' является частью класса' Tree', может быть, у вас есть 'this' в вашем' treeStack' так что вы делаете 'удалить this' – cristis
Я никогда не был слишком знаком с этим указателем или тем, чем он на самом деле является. Что мне нужно сделать, чтобы убедиться, что этот указатель больше не жалуется? – IAE
При первом взгляде я не вижу никаких сбоев. Это может быть причина, по которой он не используется для std :: stack, но, возможно, вам следует включить код, в котором вы создаете стек, если ошибка не в размещенном коде. @cristis было бы достаточно, чтобы проверить ((temp! = This) или не будет работать? – InsertNickHere