分段错误二进制搜索树
Segmentation fault Binary search Tree
我知道有几个问题有类似的标题,但我复习了一遍,仍然无法解决我的错误。
这就是BST的实现:
struct node {
int val;
node* left;
node* right;
};
node* createNewNode(int x)
{
node* nn = new node;
nn->val = x;
nn->left = nullptr;
nn->right = nullptr;
return nn;
}
void bstInsert(node* &root, int x)
{
if(root == nullptr) {
root = createNewNode(x);
return;
}
if(x < root->val)
{
if(root->left == nullptr) {
root->left = createNewNode(x);
return;
} else {
bstInsert(root->left, x);
}
}
if( x > root->val )
{
if(root->right == nullptr) {
root->right = createNewNode(x);
return;
} else {
bstInsert(root->right, x);
}
}
}
这是我的主菜:
int main() {
node *root = nullptr;
for (int i = 0; i < 100000; i++) {
bstInsert(root, i);
}
}
如果我尝试插入10000个元素,那么它可以正常工作。然而,当我尝试在调试器中插入100000个元素时:
Signal = SIGSEGV (Segmentation fault)
当循环中I的值达到32469时,会发生这种情况,我缺少什么?
首先,您的二进制搜索树是右偏二进制树,因为新元素将作为现有树的最右边的子元素添加。
也就是说,对于每次插入,递归将深入到传递给bstInsert()
的i
的值,对于i
的某个大值,它最终会在递归时耗尽空间并崩溃。在这么大的树中使用递归插入不是一个好主意。最好采用迭代实现。
附加:
添加对new
操作员故障的检查。
PS:
在我的系统上,您的代码没有因插入100000
元素而崩溃:(。
有趣的是,您的代码在fedora g++编译器上运行得很好。这可能是我的编译器将8字节分配给整数,而你的编译器可能将4字节分配给整型,所以请尝试一下并告诉我。
#include <iostream>
struct node {
long val;
node* left;
node* right;
};
node* createNewNode(long x)
{
node* nn = new node;
nn->val = x;
nn->left = nullptr;
nn->right = nullptr;
return nn;
}
void bstInsert(node* &root, long x)
{
if(root == nullptr) {
root = createNewNode( x);
return;
}
if(x < root->val)
{
if(root->left == nullptr) {
root->left = createNewNode(x);
return;
} else {
bstInsert(root->left, x);
}
}
if( x > root->val )
{
if(root->right == nullptr) {
root->right = createNewNode(x);
return;
} else {
bstInsert(root->right, x);
}
}
}
int main() {
node *root = nullptr;
for (long i = 0; i < 100000; i++) {
bstInsert(root, i);
std::cout << i << std::endl; // printing output to see the results using short gives overlow.
}
}
如果这不起作用,那么你的计算机内存没有所需的那么多,那么你可能只有不到785 KB的CPU CACHE,因为运行时程序在缓存中,而100000可能使用大约785 KB内存,在这种特定情况下,内存在缓存中是因为它在运行时,还没有应用管理。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 正在尝试重载二进制搜索树分配运算符
- 测试树是否为二进制搜索树
- 使用二进制搜索树中的迭代器对象访问左侧节点
- 二进制搜索树没有匹配的函数调用
- 二进制搜索树不变的标头文件
- 二进制搜索树插入带参数参考
- 搜索非二进制树C 的功能
- 将一个不充实的二进制搜索树转换为完整的二进制搜索树
- 二进制搜索树操作程序错误:分割故障(核心倾倒)
- 二进制搜索树插入垃圾数据
- 二进制搜索树构造的麻烦
- 将二进制搜索树导出到.csv文件
- 检查节点是否是二进制搜索树的根
- 在二进制搜索树中删除节点
- 简单的二进制搜索树非递归添加功能
- 二进制搜索树的数组实现
- 如何从二进制搜索树中删除节点
- 我如何扭转二进制搜索树
- 递归获取二进制搜索树的高度