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