二叉树分配运算符重载问题C ++

时间:2019-03-18 22:23:50

标签: c++ operator-overloading binary-tree assignment-operator

我正在尝试为我的二进制搜索树重载赋值运算符。

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

1 个答案:

答案 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)。