我仍在使用我的二叉樹,插入,查找,最大值,最小值函數都工作得很好。所以我想接下來做一個刪除功能。我包括這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