二叉树的深度复制

Deep copy of binary tree

本文关键字:复制 深度 二叉树      更新时间:2023-10-16

我有一棵树,树上有不同类型的节点,我需要对它们进行深入复制。层次结构看起来像这样:

class AllNodes
{
    //this is a purely virtual base class
};
class TreeNode : public AllNodes
{
    AllNodes *rChild, *lChild;
};
class LeefNode : public AllNodes
{
    int value;
};

问题是,当我想对整个树进行深度复制时,我不知道哪些节点会有子节点,哪些节点会具有值。我试过了,但它不起作用(原因很明显):

void AllNodes::deepCopy(AllNodes* &copied, AllNodes* o)
{
    if(o->rChild == nullptr)
        copied->rChild = nullptr;
    else
    {
        copied->rChild = o->rChild;   
        deepCopy(copied->rchild, o->rChild);
    }
    if(o->lChild == nullptr)
        copied->lChild = nullptr;
    else
    {
        copied->lChild = o->lChild;
        deepCopy(copied->lChild, o->lChild);
    }
}

有人对如何做到这一点有什么想法吗?

创建一个虚拟方法,并在TreeNode和LeafNode中实现它。

class AllNodes
{
    //this is a purely virtual base class
    virtual AllNodes* copy() const = 0;
};
class TreeNode : public AllNodes
{
    AllNodes* rChild, lChild;
    virtual AllNodes* copy() const {
         TreeNode *n = new TreeNode;
         n->rChild = rChild->copy();
         n->lChild = lChild->copy();
         return n;
    }
};
class LeafNode : public AllNodes
{
    int value;
    virtual AllNodes* copy() const {
         LeafNode *n = new LeafNode;
         n->value = value;
         return n;
    }
};

(只是草稿)

这是多态行为(根据对象的具体类型创建深度副本)。因此,它应该在虚拟函数中实现,跨整个节点层次结构。

执行深度复制的功能通常称为克隆:

class AllNodes
{
    //this is a purely virtual base class
public:
    virtual AllNodes* clone() = 0;
};
class TreeNode : public AllNodes
{
    AllNodes *rChild, *lChild; // you skipped declaring lChild as a pointer
public:
    virtual AllNodes* clone() override // recursive implementation for child nodes
    {
         return new TreeNode{
             rChild ? rChild->clone() : nullptr,
             lChild ? lChild->clone() : nullptr }; // assume existence of this
                                                   // constructor
    }
};
class LeafNode : public AllNodes
{
    int value;
public:
    virtual AllNodes* clone() override
    {
        return new LeafNode{ value }; // assume existence of this constructor
    }
};

客户端代码(整个树的深层副本):

AllNodes *original; // filled in elsewhere
AllNodes *deepCopy = original->clone();