C ++中的二进制搜索树复制构造函数

时间:2018-03-30 22:47:41

标签: c++ class binary-search-tree member

我正在尝试为我的二进制搜索编写一个复制构造函数,但由于某种原因它会出现分段错误。这是我的实现:

template <typename T>
BTree<T>::BTree(const BTree<T>& other)
{
    copy_helper(this->root, other.root); 

} 

    template <typename T>
void BTree<T>::copy_helper(Node<T>* copy_to, const Node<T>* copy_from) const
{
    if(copy_from == NULL){
        copy_to = NULL; 
    } else{
        copy_to = new Node<T>; 
        copy_to->value = copy_from->value; 
        copy_helper(copy_to->left, copy_from->left); 
        copy_helper(copy_to->right, copy_from->right); 
        copy_helper(copy_to->parent, copy_from->parent);
    }
}

2 个答案:

答案 0 :(得分:1)

问题是指针cooy_to是方法copy_helper.的局部变量。结果更改变量copy_to不会更改原始指针this->root

您应该通过引用或间接通过指针传递参数。 例如

void BTree<T>::copy_helper(Node<T>* &copy_to, const Node<T>* copy_from) const
{
    if(copy_from == NULL){
        copy_to = NULL; 
    } else{
        copy_to = new Node<T>; 
        copy_to->value = copy_from->value; 
        copy_helper(copy_to->left, copy_from->left); 
        copy_helper(copy_to->right, copy_from->right); 
        copy_helper(copy_to->parent, copy_from->parent);
    }
}

实际上,数据方法应该声明为静态函数或具有一个参数const Node<T>* copy_from的成员函数。

答案 1 :(得分:1)

如果名为parent的成员名称如此,copy_helper(copy_to->parent, copy_from->parent)将会做出可怕的事情。特别是,它会调用copy_helper来复制父母的两个孩子,这些副本将分别复制他们的父母(再次),并且该副本将复制这两个孩子(再次),无限制地或直到它崩溃

仅复制向下树。不要再回去了。