我正在从事C ++作业。该项目包括为二进制搜索树构建模板类。
到目前为止,我已经实现了基本方法和迭代器,并且一切似乎都可以正常工作。现在,我必须实现一种方法subtree(const T &value)
,在给定目标value
的情况下,返回以value
作为其根的树。
到目前为止,我已经定义了:
binarySearchTree subtree(const T &target) {
nodo* node = findValue(target);
binarySearchTree<T> newTree;
newTree._root = node;
return newTree;
}
其中findValue
是:
nodo* findValue(const T &target){
if(_root -> value == target) {
return _root;
}
else
return findValueHelper(_root, target);
}
和findValueHelper
是:
nodo* findValueHelper(nodo *ptr, const T &val) const {
if (ptr == NULL)
return NULL;
if (val < ptr -> value)
return findValueHelper(ptr -> left, val);
else if (val > ptr -> value)
return findValueHelper(ptr -> right, val);
else
return ptr;
}
和nodo
只是我的结构,带有一个T value
,一个left
和right
指针。
现在是问题所在:
提取的子树是正确的子树,但是在打印所有子树后,尽管所有元素都正确显示,但我仍然遇到segmentation fault
错误。
在main
中,我打电话:
binarySearchTree<int> sub = t.subtree(2);
std::cout << sub << std::endl;
我显然重新定义了operator=
和operator<<
。
答案 0 :(得分:2)
由于您没有发布所有实现,所以这是一个猜测,但可能是正确的。
newTree._root = node;
将指针复制到该节点。现在,您在两个树中使用了一个节点。但是树的析构函数可能会释放节点。因此,当一棵树超出范围(例如,在函数末尾)时,节点将释放,并且指针变为无效。下次分配某些内容时,您的节点将被覆盖。因此,打印仍然可以进行(虽然是未定义的行为),但是然后树就被破坏了。