Подумайте рекурсивно, когда вы пишете алгоритмы для рекурсивных структур данных.
Сначала определите ваши понятия:
Клон узла A :
Пусто, если A пусто или
Новый узел, данные которого являются копией A * 1019 Данные *, слева клон левого узла А , а справа клон правого узла А в противном случае.
Это можно перевести на вспомогательный метод:
BSNode* clone_node(const BSNode* src) {
if (src == nullptr) return nullptr;
BSNode* clonedNode = new BSNode(src.data);
clonedNode.left = clone_node(src.left);
clonedNode.right = clone_node(src.right);
return clonedNode;
}
Теперь вы можете express ваш operator=
следующим образом:
BSNode& BSNode::operator=(const BSNode& other)
{
if (this == &other) // tries to copy the object to itself
{
return *this;
}
this->data = other.data;
delete this->left;
delete this->right;
this->left = clone_node(other.left);
this->right = clone_node(other.right);
return *this;
}
Однако, если ваш левый (или правый) узел не nullptr
, вы можете использовать их повторно (вместо выделения нового узла). Напишите другой вспомогательный метод:
void clone_to(BSNode*& dest, const BSNode* src) {
if (dest != nullptr && src != nullptr) {
*dest = *src;
}
else {
delete dest;
dest = clone_node(src);
}
}
Теперь вы можете написать окончательную версию вашего operator=
:
BSNode& BSNode::operator=(const BSNode& other)
{
if (this == &other) // tries to copy the object to itself
{
return *this;
}
this->data = other.data;
clone_to(this->left, other.left);
clone_to(this->right, other.right);
return *this;
}