我有一些关于二叉搜索树(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);
没有提供有关分段错误或其他问题的任何信息。有人可以解释发生了什么吗?
答案 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);
}
}