分段错误二进制搜索树

Segmentation fault Binary search Tree

本文关键字:搜索树 二进制 错误 分段      更新时间:2024-09-24

我知道有几个问题有类似的标题,但我复习了一遍,仍然无法解决我的错误。

这就是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内存,在这种特定情况下,内存在缓存中是因为它在运行时,还没有应用管理。