Вот еще один пример, который я использовал с двоичным деревом. В этом примере узел и дерево определены в отдельных классах, а рекурсивная функция copyHelper
помогает функции copyTree
. Код не является полным, я пытался поставить только то, что необходимо для понимания того, как выполняются функции.
copyHelper:
void copyHelper(BinTreeNode<T>* copy, BinTreeNode<T>* originalNode) {
if (originalTree == NULL)
copy = NULL;
else {
// set value of copy to that of originalTree
copy->setValue(originalTree->getValue());
if (originalTree->hasLeft()) {
// call the copyHelper function on a newly created left child and set the pointers
// accordingly, I did this using an 'addLeftChild(node, value)' function, which creates
// a new node in memory, sets the left, right child, and returns that node. Notice
// I call the addLeftChild function within the recursive call to copyHelper.
copyHelper(addLeftChild(copy, originalTree->getValue()), originalTree->getLeftChild());
}
if (originalTree->hasRight()) { // same with left child
copyHelper(addRightChild(copy, originalTree->getValue()), originalTree->getRightChild());
}
} // end else
} // end copyHelper
копия: возвращает указатель на новое дерево
Tree* copy(Tree* old) {
Tree* tree = new Tree();
copyHelper(tree->root, oldTree->getRoot());
// we just created a newly allocated tree copy of oldTree!
return tree;
} // end copy
Использование:
Tree obj2 = obj2->copy(obj1);
Я надеюсь, что это поможет кому-то.
Это домашнее задание? Если это так, отметьте его как таковой. Благодаря! – bcat
В отличие от java default в C++ является закрытым, поэтому конструктор должен быть общедоступным, иначе вы не можете создавать объекты – sud03r