2016-04-12 3 views
1

Я пытаюсь написать различные методы для создания бинарных деревьев, один из которых является метод копирования из существующего двоичного дереваКопирование из одного двоичного дерева к другому

Создать дерево из вектора

binary_tree::binary_tree(const std::vector<int> &values) 
{ 
for(int i = 0; i < 5; i++) 
{ 
    insert(values[i]); 
} 
} 

Вставка узлы

void insertnode(node **tree, int value) 
{ 
if (*tree == nullptr) 
{ 
    *tree = new node; 
    (*tree)->data = value; 
    (*tree)->left = nullptr; 
    (*tree)->right = nullptr; 
} 
else 
    if(value < (*tree)->data) 
    { 
     insertnode(&(*tree)->left, value); 
    } 
    else if(value > (*tree)->data) 
    { 
     insertnode(&(*tree)->right, value); 
    } 
    else 
     return; 
} 


void binary_tree::insert(int value) 
{ 
insertnode(&tree, value); 
} 

метод Копирование

binary_tree::binary_tree(const binary_tree &rhs) 
{ 
copyTree(tree2, tree); 
} 

void copyTree(node *& tree2, node *& tree) 
{ 
if(tree == NULL) 
{ 
    tree2 = NULL; 
} 
else 
{ 
    tree2 = new node; 
    tree2->data = tree->data; 

    copyTree(tree2->left, tree->left); 
    //cout << tree2->data << " "; 
    copyTree(tree2->right, tree->right); 
} 
} 

Способ печати

std::string binary_tree::inorder() const 
{ 

inorderof(tree); 
std::string back2 = back.substr(0, back.length()-1);  
back = ""; 

return std::string(back2); 

void inorderof(node *tree)        
{ 
    if(tree != nullptr) 
    { 
     inorderof(tree->left); 
     back += to_string(tree->data); 
     back += " "; 
     inorderof(tree->right); 

    } 
} 

Главная

int main(int argc, char **argv) 
{ 

tree = new binary_tree(vector<int>{10, 5, 12, 15, 8}); 
tree->inorder(); 

binary_tree *tree2 = new binary_tree(*tree); 
tree2->inorder(); 
} 

Моя проблема заключается в том, что я должен скопировать начальное дерево - который строит и печатает прекрасно - и скопировать его с помощью

binary_tree::binary_tree(const binary_tree &rhs) 

метод, однако я получаю некоторую нерешенную внешнюю ошибку, когда дерево копируется.

Я попытался скопировать дерево без использования вышеописанного метода, который работает, однако, чтобы передать исходное двоичное дерево через аргумент в этот метод, пень меня, и я не знаю, куда идти оттуда. Я должен использовать это объявление точного метода как часть назначения, иначе я бы этого не делал!

сообщение об ошибке:

ошибка LNK2019: неразрешенный внешний символ? "Общественность: пустота __thiscall binary_tree :: copyTree (структура узла * &, структура узла * &)" (copyTree @ binary_tree @@ QAEXAAPAUnode @@ 0 @ Z) ссылка в функции "общественность: __thiscall binary_tree :: binary_tree (класс binary_tree Const &)" (?? 0binary_tree @@ QAE @ ABV0 @@ Z)

+1

Добро пожаловать в Переполнение стека. Не могли бы вы показать сообщение об ошибке, которое вы получаете? (Также я считаю, что ваш текст отключен с 'я пытался ...) –

+0

Извините, что я работал над этим весь день, и я нажал отправить по ошибке, я обновил его сейчас! Спасибо за любую помощь, которую вы можете мне дать. –

+0

is copyTree объявлен (в заголовке) членом binary_tree? Потому что он реализован (в.cpp file, как вы представили) в качестве бесплатной функции. –

ответ

0

Он не виден в коде вы в курсе, но я абсолютно уверен, что ваш заголовок содержит что-то вроде:

class binary_tree { 
... 
void copyTree(node *& tree2, node *& tree); 
... 
} 

и в исходном файле у вас есть:

void copyTree(node *& tree2, node *& tree) 
{ 
if(tree == NULL) 
{ 
    tree2 = NULL; 
} 
else 
{ 
    tree2 = new node; 
    tree2->data = tree->data; 

    copyTree(tree2->left, tree->left); 
    //cout << tree2->data << " "; 
    copyTree(tree2->right, tree->right); 
} 
} 

Вы можете это исправить либо путем изменения подписи в исходном файле на:

void binary_tree::copyTree(node *& tree2, node *& tree) {...} 

или удалением его из заголовка (если вы выбираете этот путь, убедитесь, что copyTree определяется (или, по крайней мере декларируется) в источнике до его использования (binary_tree(const binary_tree &rhs)).

+0

Спасибо, это исправлено! –

+0

@sl_x, тогда вы, возможно, захотите принять ответ;) –