Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试取消分配二进制搜索树时出错(仅适用于基本数据类型)_C++ - Fatal编程技术网

C++ 尝试取消分配二进制搜索树时出错(仅适用于基本数据类型)

C++ 尝试取消分配二进制搜索树时出错(仅适用于基本数据类型),c++,C++,我正在尝试编写一个BST,它执行常见的操作、插入、删除、搜索和遍历 问题是,当指定的使用“强”>非原始数据类型< /强>时,生成的树工作得很好,对于用户定义的结构、类和C++ STL类(如 STD::String < /Cube >) 但是当我使用int,double\u t,int64\u t等等时,它会抛出一个异常 ~BinaryNode() { 如果(左)!=NULL 删除(左); if(right.=NULL) 删除(右); //当基元数据类型 //试图解除分配的 } //使用预排序递归

我正在尝试编写一个BST,它执行常见的操作、插入、删除、搜索和遍历

问题是,当指定的使用“强”>非原始数据类型< /强>时,生成的树工作得很好,对于用户定义的结构、类和C++ STL类(如<代码> STD::String < /Cube >)

但是当我使用
int
double\u t
int64\u t
等等时,它会抛出一个异常

~BinaryNode()
{
如果(左)!=NULL
删除(左);
if(right.=NULL)
删除(右);
//当基元数据类型
//试图解除分配的
}
//使用预排序递归删除此树
作废删除(BinaryNode*节点)
{
if(node==NULL)返回;
如果(节点->左\!=NULL)
删除节点->左;
如果(节点->右侧?=空)
删除节点->右键;
节点->左=节点->右=空;
删除节点;
}
我做了很多测试,检查节点之间的完整性,这不是问题所在。因为,正如我所说的,问题在于析构函数何时到达其末端

当我使用调试器时,我看到一个
std::string
调用了它的析构函数,并且被正确地释放。但对于基元类型,它会引发类型异常:

Exception has occurred.
Trace/breakpoint trap
先谢谢你

编辑: 我将其测试为:

int main()
{
    BinarySearchTree<uint64_t> bst(
        [](const uint64_t &t1, const uint64_t &t2) -> int8_t {
            if (t1 == t2) return 0;
            if (t1 > t2) return 1;
            else return -1;
        });

    //performance slow down because there are (20000^2)/2 operations
    //to do. This is not a Self Balanced tree, so it is expected
    //it ends having worst performance than a singly linked list
    for (size_t i = 0; i <= 200; i++)
    // i <= 20000 causes error
    // i <= 200 or i <= 2000 works perfect
    {
        bst.Insert(i);
        std::cout << "i:" << i << std::endl;
    }

    std::cout << bst.Size() << std::endl;
    bst.Clear();//this generates the error. [When i <= 20000]
}
注意:
比较
是一个lambda


我认为这是一个递归错误。因为我看不到节点类,所以根据我的理解:
int这样的数据类型不能赋值为NULL。

我发现错误是由于堆栈溢出错误而产生的。为什么?因为调用堆栈添加的调用数量与树不平衡一侧的节点数量相同


由于不平衡二叉搜索树的性质,这种情况会发生,因此递归是有限制的。我尝试添加20和200个元素到一个AVLTER中,并且由于自平衡过程,它工作得很好,因为它确保树具有高度O(Ln(n))

注释:我将使用<代码> STD::UnQuyJPPT< /Cord>检查它是否在C++中不使用NULL。使用nullptr。没有足够的代码来查看问题。另外,发布更多的调试器信息。除了在
删除中执行返回的第一次空检查之外,代码中不需要任何空指针检查。删除null ptr完全可以,如果节点为null,则函数
Deleting
已经返回。你发布的代码中至少有一半会消失。你不需要这么复杂的删除代码。它一事无成。您只需要
~BinaryNode(){delete left\uuu;delete right\uu;}
。您也不需要单独的节点类。每个节点都是一棵树。代码中根本没有赋值,更不用说NULL赋值了。