正在无限调用二进制搜索树的复制构造函数

时间:2011-04-17 21:21:25

标签: c++ binary-tree

我正在编写二叉搜索树的构造函数,问题是树中的辅助函数被无限调用,这最终会产生堆栈溢出。

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数据对象不是原始数据类型,但没有动态内存分配。

2 个答案:

答案 0 :(得分:4)

我不确定这可能会导致无限递归,但您的getLeft()函数似乎很可疑。您将返回对堆栈中某些内容的引用。谁知道那之后发生在那段记忆中的事情。看起来你一遍又一遍地在内存中使用相同的插槽,所以你可能正在创建一个循环而不是树。

更改它以使其返回指针,而不是对指针的引用(删除'&amp;')。

答案 1 :(得分:1)

@JCooper想出来了 - 我只是提供示例代码。 getLeft()函数看起来应该更像这样。请注意,我没有创建任何新变量,因此没有堆栈生命周期问题。

const myTreeNode * getLeft() const
{
    //may be NULL
    return this->left;
}

(编辑:使代码更简洁。感谢@molbdnilo!)