我正在编写二叉搜索树的构造函数,问题是树中的辅助函数被无限调用,这最终会产生堆栈溢出。
void copyTree(myTreeNode* & copy, const myTreeNode* & originalTree)
{
if(originalTree==NULL)
{
copy=NULL;
}
else
{
copy=new myTreeNode();
cout<<"This is the data my friend: "<<endl<<copy->data.getCharacter()<<endl;
copy->data=originalTree->data;
copyTree(copy->left, originalTree->getLeft());
copyTree(copy->right,originalTree->getRight());
}
}
//this is the copy constructor for the tree
myTree (const myTree & copy)
{
this->copyTree(this->root,copy.getRoot());
}
//and this is the way I have written the getLeft and getRight Functions
//they both return references to the left and rightNodes
const myTreeNode *& getLeft() const
{
const myTreeNode* ptr=NULL;
if(this->left)
{
ptr=this->left;
}
return ptr;
}
P.S数据对象不是原始数据类型,但没有动态内存分配。
答案 0 :(得分:4)
我不确定这可能会导致无限递归,但您的getLeft()
函数似乎很可疑。您将返回对堆栈中某些内容的引用。谁知道那之后发生在那段记忆中的事情。看起来你一遍又一遍地在内存中使用相同的插槽,所以你可能正在创建一个循环而不是树。
更改它以使其返回指针,而不是对指针的引用(删除'&amp;')。
答案 1 :(得分:1)
@JCooper想出来了 - 我只是提供示例代码。 getLeft()函数看起来应该更像这样。请注意,我没有创建任何新变量,因此没有堆栈生命周期问题。
const myTreeNode * getLeft() const
{
//may be NULL
return this->left;
}
(编辑:使代码更简洁。感谢@molbdnilo!)