У меня есть это дерево с различными типами узлов, на которых мне нужно сделать глубокую копию. Иерархия выглядит примерно так:Глубокая копия двоичного дерева
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);
}
}
Кто-нибудь есть некоторые идеи о том, как это сделать?
Надеюсь, что это на самом деле 'AllNodes * rChild * lChild ; '. *Большая разница. И это не делает * node * copy * вообще * Если вы делаете истинную глубокую «копию», вы можете рассчитывать фактически выделить некоторые * узлы * в этом процессе. – WhozCraig
Что делать, если вы просто использовали 'value_ptr' для хранения узлов? И 'variant', чтобы сохранить либо значение, либо детей. –
Вы просто назначаете указатели, так что это мелкая копия ... сначала выделите память, а затем скопируйте данные в эту новую память, а затем назначьте указатели –