Проблема перегрузки оператора двоичного дерева назначения C ++ - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь перегрузить оператор присваивания для моего Двоичного дерева поиска.

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))
{
}

deepCopyTree возвращает узел *

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;
    }
}

1 Ответ

0 голосов
/ 19 марта 2019

При условии, что конструктор и деструктор копирования для BST работают правильно (и что конструктор копирования не использует оператор присваивания), оператор присваивания BST может быть легко записан с использованием идиомы copy / swap :

#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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...