我正在为我正在创建的二叉树函数编写各种运算符重载,规范需要重载才能将一棵树复制到另一棵树。
binary_tree& binary_tree::operator=(const binary_tree &other)
{
return binary_tree();
}
操作员的工作测试如下,
int main(int argc, char **argv)
{
tree = new binary_tree(vector<int>{11, 5, 3, 7});
binary_tree temp = *tree;
temp.insert(12);
str = temp.inorder();
if (str != string("3 5 7 11 12") && temp.inorder() != tree->inorder())
cerr << "test failed (assignment operator)" << endl;
else
cout << "test passed (assignment operator)" << endl;
}
显然,这个测试的目的是创建一个新的树temp,它具有原始值,但我似乎无法使它工作,所以当调用.insert(12)时,它不会'改变原始树。操作员必须根据未经编辑的主要测试工作。
我在=运算符中尝试了各种各样的东西,但它们似乎都没有任何效果。我有像
这样的方法void binary_tree::copyTree(node *& tree2, node *& tree)
{
if(tree == NULL)
{
tree2 = NULL;
}
else
{
tree2 = new node;
tree2->data = tree->data;
copyTree(tree2->left, tree->left);
copyTree(tree2->right, tree->right);
}
}
但使用它们似乎没有做任何有用的事情。
答案 0 :(得分:2)
如果尝试通过引用返回运算符的本地对象
,则所有尝试都将失败binary_tree& binary_tree::operator=(const binary_tree &other)
{
...
return binary_tree(); // <=== ouch: the reference will be invalid !
}
对于赋值运算符,您最好返回当前树的引用:
binary_tree& binary_tree::operator=(const binary_tree &other)
{
... // make your copy here
return *this;
}
现在要实施您的复制,您可以考虑重复使用binary_tree::copyTree()
。假设你的树中有node* root
,它就像是:
binary_tree& binary_tree::operator=(const binary_tree &other)
{
copyTree (root, other.root);
return *this;
}