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