在C ++中从BST提取子树

时间:2018-06-28 11:54:33

标签: c++ binary-search-tree

我正在从事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,一个leftright指针。

现在是问题所在:

提取的子树是正确的子树,但是在打印所有子树后,尽管所有元素都正确显示,但我仍然遇到segmentation fault错误。

main中,我打电话:

binarySearchTree<int> sub = t.subtree(2);
std::cout << sub << std::endl;

我显然重新定义了operator=operator<<

1 个答案:

答案 0 :(得分:2)

由于您没有发布所有实现,所以这是一个猜测,但可能是正确的。

newTree._root = node;将指针复制到该节点。现在,您在两个树中使用了一个节点。但是树的析构函数可能会释放节点。因此,当一棵树超出范围(例如,在函数末尾)时,节点将释放,并且指针变为无效。下次分配某些内容时,您的节点将被覆盖。因此,打印仍然可以进行(虽然是未定义的行为),但是然后树就被破坏了。