【发布时间】:2011-03-08 14:09:41
【问题描述】:
我仍在研究我的二叉树,到目前为止,插入、查找、最大值、最小值函数都运行良好。所以接下来我想做一个删除功能。我包含了一个可以保存的堆栈 - 啊地狱,我将只显示代码:
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;
是我将元素推入堆栈的位置。
其他问题: std::stack 是否必须在 ctor 中构建?
【问题讨论】:
-
我看到
eraseTree是Tree类的一部分,也许你的treeStack中有this,所以你正在做delete this -
我从来没有对 this 指针太熟悉,或者它实际上是什么。我需要做些什么来确保 this 指针不再抱怨?
-
乍一看,我看不到任何故障。这可能是我不习惯 std::stack 的原因,但如果错误不在发布的代码中,也许你应该包含构建堆栈的代码。 @cristis 检查 if(temp!=this) 是否足够?
-
@InsertNickHere:我试过了。
temp != this是真的。Temp不是this。 -
关于指针的小事:你应该用 != null 检查每个用法,例如。 if(parent!=null){...} 和 if(temp!=null),这样可以更轻松地避免/查找故障。
标签: c++ stl stack binary-tree