2016-04-12 14 views
1

Ich versuche, verschiedene Methoden zu schreiben Binärbäumen von denen zu schaffen, ist eine Kopiermethode aus einem vorhandenen binären BaumKopieren von einem binären Baum zu einem anderen

Baum von Vektor erstellen

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

einfügen Knoten

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); 
} 

Kopieren Methode

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); 
} 
} 

Druckverfahren

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); 

    } 
} 

Haupt

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(); 
} 

Mein Problem ist, dass ich den ursprünglichen Baum kopieren - das und Druck völlig in Ordnung baut - und kopieren Sie die

binary_tree::binary_tree(const binary_tree &rhs) 

mit Methode, aber ich bekomme einen ungelösten externen Fehler, wenn der Baum kopiert wird.

Ich habe versucht, den Baum zu kopieren, ohne die obige Methode zu verwenden, die funktioniert, jedoch den anfänglichen binären Baum als Argument in diese Methode übergeben zu müssen, stumpt mich und ich weiß nicht, wohin ich von dort gehen soll. Ich muss diese genaue Methodendeklaration als Teil einer Aufgabe verwenden, sonst würde ich es nicht so machen!

Fehlermeldung:

Fehler LNK2019: nicht aufgelöstes externes Symbol? "Public: void __thiscall binary_tree :: copyTree (struct node * &, struct node * &)" (copyTree @ binary_tree @@ QAEXAAPAUnode @@ 0 @ Z) in Funktion verwiesen "public: __thiscall binary_tree :: binary_tree (Klasse binary_tree const &)" (?? 0binary_tree @@ QAE @ ABV0 @@ Z)

+1

Willkommen bei Stack Overflow. Können Sie möglicherweise die Fehlermeldung anzeigen, die Sie erhalten? (Ich glaube auch, dass dein Text abgeschnitten hat mit 'Ich habe versucht, ... ') –

+0

Entschuldigung, ich habe den ganzen Tag daran gearbeitet und ich habe versehentlich gedrängt, ich habe es jetzt aktualisiert! Vielen Dank für jede Hilfe, die Sie mir geben können –

+0

ist CopyTree als Mitglied von binary_tree deklariert (in der Kopfzeile)? Weil es implementiert ist (in der.cpp-Datei, wie Sie vorgestellt haben) als freie Funktion. –

Antwort

0

Es ist nicht sichtbar in den Code, den Sie geschrieben, aber ich bin ziemlich sicher, dass Ihre Header enthält so etwas wie:

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

und in der Quelldatei Sie haben:

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); 
} 
} 

Sie können dieses Problem beheben entweder durch in Quelldatei zu ändern Signatur:

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

oder durch von Header zu entfernen (wenn Sie diesen Weg wählen, stellen Sie sicher, dass copyTree definiert (oder zumindest erklärt) in der Quelle vor ihrer Verwendung (binary_tree(const binary_tree &rhs)).

+0

Vielen Dank, das hat es behoben! –

+0

@sl_x dann möchten Sie vielleicht die Antwort akzeptieren;) –

Verwandte Themen