我仍在使用我的二叉树,插入,查找,最大值,最小值函数都工作得很好。所以我想接下来做一个删除功能。我包括这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时,我实际上是否删除节点?
编辑:
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;
就是我推堆在我的元素。
附加问题:是否必须在ctor中构建std :: stack?
我看到'eraseTree'是'Tree'类的一部分,也许你有'this'在'treeStack'所以你在做'删除this' – cristis 2010-06-26 09:15:12
我已经从来不太熟悉这个指针,或者它实际上是什么。我需要做些什么来确保这个指针不再抱怨? – IAE 2010-06-26 09:16:53
在第一眼看,我看不到任何失败。这可能是它不适用于std :: stack的原因,但是如果错误不在发布的代码中,也许你应该在代码中包含构建堆栈的代码。 @cristis是否足以检查(temp!= this)还是不接受这项工作? – InsertNickHere 2010-06-26 09:19:11