二叉树赋值运算符重载问题C++
Binary Tree Assignment Operator Overload Problem C++
我正在尝试为我的二叉搜索树重载赋值运算符。
Example: tree1 = tree2
我想删除 tree1 中的所有节点,并对树中的所有节点进行深度复制。
我已经有功能了:
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))
{
}
deepCopyTreereturns节点*
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;
}
}
只要BST
的拷贝构造函数和析构函数正常工作(并且拷贝构造函数不使用赋值运算符),BST
赋值运算符可以很容易地使用copy/swap idiom:
#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
)。
我正在尝试为我的二叉搜索树重载赋值运算符。
Example: tree1 = tree2
我想删除 tree1 中的所有节点,并对树中的所有节点进行深度复制。
我已经有功能了:
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))
{
}
deepCopyTreereturns节点*
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;
}
}
只要BST
的拷贝构造函数和析构函数正常工作(并且拷贝构造函数不使用赋值运算符),BST
赋值运算符可以很容易地使用copy/swap idiom:
#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
)。