Вы в принципе правильно поняли.
Вы просто забыли проверить наличие указателей NULL.
BinStrTreeNode::BinStrTreeNode(const BinStrTreeNode& rhs)
:_val(rhs._val)
,_leftchild(NULL)
,_rightchild(NULL)
{
cout << "copy ctor" << endl;
if (rhs._leftchild != NULL) {_leftchild = new BinStrTreeNode(*(rhs._leftchild));}
if (rhs._rightchild != NULL) {_rightchild = new BinStrTreeNode(*(rhs._rightchild));}
}
Обратите внимание, что деревья не будут указывать на узел выше (или себя) в дереве (как это было быбольше не быть деревом, это был бы график).Если ваш код представляет собой график, то вам нужно переписать его, чтобы сделать копию графика, которая намного сложнее, так как вам нужно отслеживать, какие узлы были скопированы на карте.
Хотя лично ясделаю еще один шаг и сделаю все в списке инициализаторов:
Хотя я бы просто сказал, что это личное предпочтение.
BinStrTreeNode::BinStrTreeNode(const BinStrTreeNode& rhs)
:_val(rhs._val)
,_leftchild ((rhs._leftchild == NULL)?NULL:new BinStrTreeNode(*(rhs._leftchild)))
,_rightchild((rhs._rightchild == NULL)?NULL:new BinStrTreeNode(*(rhs._rightchild)))
{
cout << "copy ctor" << endl;
}
Циклические деревья (графики АКА)
Давайте начнем с нуля здесь:
В этой ситуации нам нужно отслеживать каждый узел, который мы создаем.Затем, когда указатель указывает назад на узел, который уже был скопирован, мы используем скопированный узел, а не создаем новый (в противном случае мы оказываемся в рекурсивном кошмаре после цикла вокруг и вокруг и вокруг).
typedef std::map<BinStrTreeNode*,BinStrTreeNode*> CopyMap;
BinStrTreeNode::BinStrTreeNode(const BinStrTreeNode& rhs)
:_val(rhs._val)
{
CopyMap copyMap;
copyMap[&rhs] = this;
left = copyGraph(left,copyMap);
right = copyGraph(right,copyMap)
}
private:
BinStrTreeNode* BinStrTreeNode::copyGraph(BinStrTreeNode* node,CopyMap& copyMap)
{
if (node == NULL)
{ return NULL;
}
if (copyMap[node] != NULL)
{ return copyMap[ndoe];
}
return new BinStrTreeNode(*node, copyMap);
}
BinStrTreeNode::BinStrTreeNode(const BinStrTreeNode& rhs, CopyMap& copyMap)
:_val(rhs._val)
{
copyMap[&rhs] = this;
left = copyGraph(left,copyMap);
right = copyGraph(right,copyMap)
}