我目前正在开发一个应该生成至少100,000个网址(www.google.com.my)的程序,并将它们插入到二叉搜索树(BST)和哈希表中。我得到了他们两个,但是当我尝试在BST中插入100,000个URL时,我得到以下内容:Process returned -1073741571 (0xC00000FD) execution time: 21.358 s
。当我运行调试器时,我得到以下内容:Program received signal SIGSEGV, Segmentation fault.In ?? () ()
。调试器没有显示错误是哪一行,所以问题出在哪里以及如何解决?
这是我的代码:
的main.cpp
#include <iostream>
#include <ctime>
#include <vector>
#include <stdint.h>
#include <cstdlib>
#include <fstream>
#include <string>
#include <conio.h>
#include <stdexcept>
#include "HashTable.cpp"
#include "BinarySearch.h"
using namespace std;
HashTable<long long> ht(0);
treeNode *root = NULL;
vector<long long> dataList;
bool error_msg = false;
static long long nextIC = 1;
long long getNextIC()
{
return ++nextIC;
}
.
.
.
.
ifstream file2(fileName);
while (getline(file2, str))
{
root = insertNode(root, countData);
countData++;
}
file2.close();
end = clock();
elapsed_secs = double(end - begin) / ( CLOCKS_PER_SEC / 1000);
BinarySearch.h
#include <iostream>
#include <stdlib.h>
#include <conio.h>
using namespace std;
struct treeNode
{
long long data;
treeNode *left;
treeNode *right;
};
treeNode *insertNode(treeNode *node,long long data)
{
if(node==NULL)
{
treeNode *temp = new treeNode();
temp -> data = data;
temp -> left = temp -> right = NULL;
return temp;
}
if(data >(node->data))
{
node->right = insertNode(node->right,data);
}
else if(data < (node->data))
{
node->left = insertNode(node->left,data);
}
/* Else there is nothing to do as the data is already in the tree. */
return node;
}
treeNode * searchNode(treeNode *node, long long data)
{
if(node==NULL)
{
/* Element is not found */
return NULL;
}
if(data > node->data)
{
/* Search in the right sub tree. */
return searchNode(node->right,data);
}
else if(data < node->data)
{
/* Search in the left sub tree. */
return searchNode(node->left,data);
}
else
{
/* Element Found */
return node;
}
}
void displayInorder(treeNode *node)
{
if(node==NULL)
{
return;
}
displayInorder(node->left);
cout<<" " << node->data<<" ";
displayInorder(node->right);
}
void displayPreorder(treeNode *node)
{
if(node==NULL)
{
return;
}
cout<<" " <<node->data<<" ";
displayPreorder(node->left);
displayPreorder(node->right);
}
void displayPostorder(treeNode *node)
{
if(node==NULL)
{
return;
}
displayPostorder(node->left);
displayPostorder(node->right);
cout<<" " <<node->data<<" ";
}
答案 0 :(得分:1)
树的最大深度受限,即从根到最远叶的距离。这种限制是由树算法的递归性质强加的,因为递归深度本身受到堆栈存储器大小的限制。递归深度受到堆栈空间的限制,因为每个函数调用都会在堆栈上放置一个新的调用帧。
这种最大深度限制是非平衡BST的问题,因为这种树可能变得不平衡。在最坏的情况下,当元素按排序顺序(或反向)插入时,深度会线性增长。
要支持任何插入顺序中的大量元素,您可以使用平衡的BST,例如红黑树或AVL树。对于平衡树,深度限制要小得多,因为它们的最大深度是对数增长的。