二叉树赋值运算符重载问题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)。