我正在尝试为我的二进制搜索树重载赋值运算符。
Example: tree1 = tree2
我要删除tree1中的所有节点,并复制tree中所有节点的深层副本。
我已经具有功能:
Node* deepCopyTree(const Node *source)
效果很好。我还创建了此功能:
void deleteTree(Node* root)
{
if (root)
{
deleteTree(root->left);
deleteTree(root->right);
delete root;
}
}
在我的调试中,它可以正常工作。运算符重载功能:
BST& BST::operator=(const BST &rhs)
{
DestroyRecursive(root);
deepCopyTree(rhs.root);
return *this;
}
这会在复制时引发错误。我正在工作10个小时,这是我剩下的最小的东西,我想完成它。请帮忙:)。
这是我的深层复制构造函数:
BST::BST(const bST&rhs)
:root(deepCopyTree(rhs.root))
{
}
deepCopyTree返回Node *
struct Node
{
std::string value = "";
Node *left = nullptr;
Node *right = nullptr;
};
解构器:
BST::~BST()
{
DeleteTree(this->root);
}
void DeleteTree(Node* root)
{
if (root)
{
DeleteTree(root->left);
DeleteTree(root->right);
delete root;
}
}
答案 0 :(得分:0)
假设BST
的副本构造函数和析构函数正常工作(并且副本构造函数不使用赋值运算符),可以使用{{3}轻松编写BST
赋值运算符}:
#include <algorithm>
//...
BST& BST::operator=(const BST &rhs)
{
if ( &rhs != this ) // for optimization purposes, check for self assignment
{
BST temp(rhs); // copy the rhs (uses copy constructor)
std::swap(temp.root, root); // swap out the members (root with temp.root)
} // temp now dies off with the old data (uses destructor)
return *this;
}
请注意,我们所做的只是创建一个临时文件(这就是为什么复制构造函数必须正常工作的原因)。然后将this
成员换成临时成员。完成此操作后,temp
被销毁时,它会带走旧数据(这就是析构函数必须正确工作的原因)。
如果有更多成员,那么您也需要换出这些成员(我假设BST
中唯一的成员变量是root
)。