将超过30,000个元素插入二叉搜索树时发生分页错误

时间:2018-02-05 10:17:43

标签: c++ data-structures binary-search-tree

我目前正在开发一个应该生成至少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<<" ";
}

1 个答案:

答案 0 :(得分:1)

树的最大深度受限,即从根到最远叶的距离。这种限制是由树算法的递归性质强加的,因为递归深度本身受到堆栈存储器大小的限制。递归深度受到堆栈空间的限制,因为每个函数调用都会在堆栈上放置一个新的调用帧。

这种最大深度限制是非平衡BST的问题,因为这种树可能变得不平衡。在最坏的情况下,当元素按排序顺序(或反向)插入时,深度会线性增长。

要支持任何插入顺序中的大量元素,您可以使用平衡的BST,例如红黑树或AVL树。对于平衡树,深度限制要小得多,因为它们的最大深度是对数增长的。