我的运算符+ =二叉搜索树有什么问题?

时间:2013-11-22 06:04:35

标签: c++ data-structures tree

我有一些关于二叉搜索树(BSTreeBag)的代码,我无法弄清楚。

“operator + =(const BSTreeBag& addend)”需要将加数中的内容插入到我们当前的树中。如果我们拥有的当前树与“addend”相同,我们需要将树加倍(以复制树中的所有项目)

这是我的代码

template <class ItemType>
void BSTreeBag<ItemType>::operator +=(const BSTreeBag& addend)
{
    if(this==&addend)//This works
    {
        binary_tree_node<ItemType>* addroot_ptr=root_ptr;//create a pointer
                                                         //that points to the current tree 
        insert_all(addroot_ptr);//This is a helper function that insert 
                                //every item of the addend into the current tree. It works fine.
    }
    else
    {
        insert_all(addend.root_ptr);
    }
}

只要不进行自我分配,代码行就能完美运行。它总是停在

insert_all(addroot_ptr);

没有提供有关分段错误或其他问题的任何信息。有人可以解释发生了什么吗?

2 个答案:

答案 0 :(得分:6)

一个非常可能的问题是,当您向自身添加一棵树时,您将拥有一个无限循环。与之类似,您在迭代树时添加节点,但由于添加了新节点,因此无限制地继续迭代和添加节点。

让我们举一个简单列表的例子。假设您有以下列表:

root -> A

现在,如果您尝试将列表添加到自身,则从根指针迭代列表,找到节点A,然后添加该节点。现在您的列表看起来像

root -> A -> A

继续迭代并找到... node A(再次),然后添加它:

root -> A -> A -> A

依旧等等。

您可能应该从root_ptr创建一个全新的树,然后添加它。

答案 1 :(得分:2)

这就是我的样子(我认为指令和测试文件都有点怪):

template <class ItemType>
void BSTreeBag<ItemType>::operator+=(const BSTreeBag& addend)
{
    if (this != &addend)  
        insert_all(addend.root_ptr);
    else
    {
        BSTreeBag<ItemType> new_bst = addend;
        insert_all(new_bst.root_ptr);
        tree_clear(new_bst.root_ptr);
    }
}