【问题标题】:Binary Search Tree Implementation C++ Runtime Error二叉搜索树实现 C++ 运行时错误
【发布时间】:2017-06-16 21:43:58
【问题描述】:

在 C++ 中实现 BST 时遇到问题。当我将大约 20,000 条数据的小数据插入 BST 时,它运行良好。如果我尝试插入 100,000 左右的大量数据。 BST 出现运行时错误。你们能帮帮我吗?

这是我的实现。 Binary Search.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 = (treeNode *)malloc(sizeof(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<<" ";
}

我在以下位置收到运行时错误:

node->right = insertNode(node->right,data);

请帮帮我。

提前谢谢你!

【问题讨论】:

  • 显示您的main 例程或插入流程
  • 也许递归深度太大了?您的操作系统中每个进程的堆栈有多大?
  • 旁注:您正在泄漏内存。
  • 这可能只是因为有这么多的元素,你的堆空间用完了。搜索如何增加堆大小,执行此操作,然后回复我们。
  • 将递归更改为 while 循环。由于您没有重新平衡树,因此 100,000 个有序元素总是会破坏您的堆栈。测试用例:依次插入1到1,000,000。

标签: c++ error-handling runtime binary-search-tree


【解决方案1】:

您很可能在所有递归中都用完了堆栈,因此您可以增加堆栈,或者编写部分(或全部)函数以使用迭代而不是递归(尽管前序、后序、中序遍历很难正确地写为循环)。

这是SearchInsert 方法的简单示例:

struct TreeNode
{
    long long data = 0;
    std::shared_ptr<TreeNode> left;
    std::shared_ptr<TreeNode> right;
    TreeNode(long long _data) : data(_data){}
};

class BST
{
    public:
    void Insert(std::shared_ptr<TreeNode> node)
    {
        if (!node)
           throw std::runtime_error("Cannot insert null node");

        if (!root)
        {
           root = node;
           return;
        }

        std::shared_ptr<TreeNode>* next = &root;
        while(*next)
        {
            if (node->data < (*next)->data)
                next = &((*next)->left);
            else
                next = &((*next)->right);
        }
        *next = node;
    }

    std::pair<bool, std::shared_ptr<TreeNode>> Search(long long data)
    {
        if (!root)
           return std::make_pair(false, nullptr); // searching empty tree

        std::shared_ptr<TreeNode> next = root;
        while(next)
        {
            if (data < next->data)
                next = next->left;
            else if (data > next->data)
                next = next->right;
            else
                return std::make_pair(true, next); // match found
        }

        // no match found
        return std::make_pair(false, nullptr);
    }

    private:
    std::shared_ptr<TreeNode> root;
};

可以找到完整的工作演示 here

【讨论】:

  • 非常感谢演示。它现在工作得很好。 Andy,你能帮忙弄清楚你的代码的 Inorder、Preorder 和 Postorder 函数吗?
猜你喜欢
  • 2019-04-15
  • 2013-05-03
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多