2016-06-26 16 views
1

Wenn ich diese verwenden, um einen binären Baum für = Operator wie folgtC++ einen binären Baum

BTNode<ElemType>* BinaryTree<ElemType>::_Copy(BTNode<ElemType>* T){ 
    if (T == NULL){ 
     return NULL; 
    } 
    BTNode<ElemType> *p; 
    p = new BTNode<ElemType>; 
    p->data = T->data; 
    p->lchild = _Copy(T->lchild); 
    p->rchild = _Copy(T->rchild); 
    return p; 
} 

und stellen Überlastfunktion zu kopieren:

BinaryTree& operator=(const BinaryTree &rhs){ 
    if (&rhs == this){ 
     return *this; 
    } 
    _Destroy (m_root); 
    m_root = _Copy (rhs.m_root); 
    return *this; 
} 

dann, wenn ich zwei treetype Element tree_1 und tree_2.

Als ich

tree_2 = tree_1; 

kopiere ich alle das Element tree_1-tree_2. Und zu diesem Zeitpunkt füge ich einen neuen Knoten tree_2 hinzu. Die tree_1 wird ebenfalls geändert. Wie kann ich eine neue rekursive Kopierfunktion einstellen, die tree_1 gleich bleibt und nur die Struktur von tree_2 ändert?

+0

Warum definieren Sie eine _Copy-Funktion, anstatt einen Kopierkonstruktor zu definieren? Wenn Sie einen Zuweisungsoperator definieren, sollten Sie im Allgemeinen auch einen Kopierkonstruktor definieren. Wenn Sie Semantik für tiefe Kopien/Zuweisungen definieren müssen, sollten Sie dies auch für jeden beteiligten Typ tun. Außerdem ist dieser Code voller Speicherlecks. –

Antwort

-1

overide Sie nur den Knotenelement BTnode = Operator

das ist Art und Weise seine Arbeit für die Root-Kopie , wenn Sie die Bäume kopieren [tree_2 = tree_1;]

Sie die defult Kopie Ctor verwenden dass C++ bieten die bitweise Kopie (tiefe Kopie) Sie benötigen eine Kopie ctor für den Baum, implementieren foreach Knoten der Operator „=“ allreay Sie zum erstellen

node *Cpy(root) { 

    if (root == NULL) : return root; 

    node *temp = new node(); 
    temp->data = root-> data;  

    temp->left = Cpy(root -> left); 

    temp->right = Cpy(root -> right); 

    return temp; 
} 
+1

Sie sollten versuchen, das Englisch in Ihrer Antwort ein wenig zu verbessern. –

+0

Verwenden Sie mindestens 'shared_ptr' oder etwas. Das wird wie verrückt auslaufen. Auch der Standardkopiekonstruktor ist keine tiefe Kopie. –

+0

Sie haben recht, ich meinte Operator = –

Verwandte Themen