从C+中的BST中提取子树+; 我正在研究C++赋值。该项目包括为二叉搜索树构建模板类
到目前为止,我已经实现了基本原理、方法和迭代器,一切似乎都很好。现在我必须实现一个方法从C+中的BST中提取子树+; 我正在研究C++赋值。该项目包括为二叉搜索树构建模板类,c++,binary-search-tree,C++,Binary Search Tree,到目前为止,我已经实现了基本原理、方法和迭代器,一切似乎都很好。现在我必须实现一个方法子树(const T&value),给定目标值,该方法返回以值为根的树 到目前为止,我已经定义了: binarySearchTree subtree(const T &target) { nodo* node = findValue(target); binarySearchTree<T> newTree; newTree._root =
子树(const T&value)
,给定目标值
,该方法返回以值
为根的树
到目前为止,我已经定义了:
binarySearchTree subtree(const T &target) {
nodo* node = findValue(target);
binarySearchTree<T> newTree;
newTree._root = node;
return newTree;
}
而findValueHelper
是:
nodo* findValue(const T &target){
if(_root -> value == target) {
return _root;
}
else
return findValueHelper(_root, target);
}
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;
}
显然,我重新定义了
操作符=
和操作符,因为您没有发布所有的实现,这只是猜测,但可能是正确的
newTree.\u root=node代码>将指针复制到节点。现在,在两棵树中使用了一个节点。但是树的析构函数可能会释放节点。因此,当一棵树超出范围(例如,在函数末尾)时,节点a将被释放,指针将无效。下次分配某些内容时,您的节点将被覆盖。因此,打印仍然有效(虽然是未定义的行为),但随后您的树会损坏。由于您没有发布所有实现,这只是猜测,但可能是正确的
newTree.\u root=node代码>将指针复制到节点。现在,在两棵树中使用了一个节点。但是树的析构函数可能会释放节点。因此,当一棵树超出范围(例如,在函数末尾)时,节点a将被释放,指针将无效。下次分配某些内容时,您的节点将被覆盖。因此,打印仍然有效(虽然是未定义的行为),但随后您的树会损坏。是否在节点构造函数中将left和right设置为NULL?你确定是子树
函数而不是打印函数导致了问题吗?@Qubit打印函数工作正常,我已经在“正常构造”树上测试过了。是的,在构造函数中将left和right设置为NULL。那么答案可能就是原因。您是否在节点构造函数中将left和right设置为NULL?你确定是子树
函数而不是打印函数导致了问题吗?@Qubit打印函数工作正常,我已经在“正常构造”树上测试过了。是的,左和右在构造函数中被设置为NULL。然后答案表明可能是原因。是的,这是有意义的!我是否应该构建一个新节点并使用该节点?如果这样做,则必须对整个子树进行深度复制。我想这真的取决于你想对这个子树做什么,如果它是临时的,你可以在完成后简单地将它的根设置为NULL(并且确保析构函数没有试图释放它),以避免双重释放数据。是的,它是绝对临时的,我只需要提取它并基本上打印它。我认为这是可行的,我定义了一个emptyRoot方法,它只将根设置为NULL,我不再得到sigsev错误。谢谢是的,这很有道理!我是否应该构建一个新节点并使用该节点?如果这样做,则必须对整个子树进行深度复制。我想这真的取决于你想对这个子树做什么,如果它是临时的,你可以在完成后简单地将它的根设置为NULL(并且确保析构函数没有试图释放它),以避免双重释放数据。是的,它是绝对临时的,我只需要提取它并基本上打印它。我认为这是可行的,我定义了一个emptyRoot方法,它只将根设置为NULL,我不再得到sigsev错误。谢谢
binarySearchTree<int> sub = t.subtree(2);
std::cout << sub << std::endl;