首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二叉树递归插入导致堆栈溢出,迭代插入无效

问二叉树递归插入导致堆栈溢出,迭代插入无效
EN

Stack Overflow用户
提问于 2014-11-09 06:14:42
回答 1查看 580关注 0票数 1

我要为类做这个项目,在这个项目中,我必须向二进制搜索树中添加10000个元素(以便) --还有其他一些事情,但这不是当前的问题。我的递归插入工作正常,直到大约3500个元素,然后它中断并导致堆栈溢出。然后,我尝试创建代码的迭代版本,但它只添加了元素9999和10000。所以我的问题是:

如何使递归插入对大量排序元素起作用?或者如何使迭代插入工作?

我的密码在这里:

递归:

代码语言:javascript
复制
template <typename T>
void BST<T>::insert(BST_Node<T>*& node, const T& data)
{
    if (node == NULL)
    {
        node = new BST_Node<T>(data);
        return;
    }

    if (node->mData == data)
    {
        cout << "Node already exists!" << endl;
        return;
    }

    if (data < node->mData)
        insert(node->mLeft, data);
    else
        insert(node->mRight, data);
}

迭代:

代码语言:javascript
复制
template <typename T>
void BST<T>::insertIterative(BST_Node<T>*& node, const T& data)
{
    if (node == NULL)
    {
        node = new BST_Node<T>(data);
        return;
    }    

    while (node != NULL)
    {
        if (data < node->mData)
        {
            if (node->mLeft == NULL)
            {
            node->mLeft = new BST_Node<T>(data);
            return;
        }
        else
            node = node->mLeft;
    }
    else if (data > node->mData)
    {
        if (node->mRight == NULL)
        {
            node->mRight = new BST_Node<T>(data);
            return;
        }
        else
            node = node->mRight;
    }
}

此外,如果有必要,以下是我的公共插入函数:

代码语言:javascript
复制
template <typename T>
void BST<T>::insert(T data)
{
    insert(mRootNode, data); //insertIterative(mRootNode, data);
}

最后,下面是我的递归代码中断时遇到的错误:

在PA7.exe: 0xC00000FD中0x7717CF87 (ntdll.dll)处未处理的异常:堆栈溢出(参数: 0x00000001,0x006F2FF0)。

我的BST_Node构造器:

代码语言:javascript
复制
template <typename T>
struct BST_Node
{
    T           mData;
    BST_Node<T> *mLeft, *mRight;

    BST_Node();
    BST_Node(T data);
    BST_Node(T data, BST_Node<T> *left, BST_Node<T> *right);
};

template <typename T>
BST_Node<T>::BST_Node()
{
    mData = 0;
    mLeft = NULL;
    mRight = NULL;
}

template <typename T>
BST_Node<T>::BST_Node(T data)
{
    mData = data;
    mLeft = NULL;
    mRight = NULL;
}

template <typename T>
BST_Node<T>::BST_Node(T data, BST_Node<T> *left, BST_Node<T> *right)
{
    mData = data;
    mLeft = left;
    mRight = right;
}

BST建设者:

代码语言:javascript
复制
template <typename T>
BST<T>::BST()
{
    mRootNode = NULL;
}

template <typename T>
BST<T>::BST(T data, BST_Node<T> *left, BST_Node<T> *right)
{
    mRootNode->mLeft = left;
    mRootNode->mRight = right;
    mRootNode->mData = data;
}
EN

回答 1

Stack Overflow用户

发布于 2014-11-09 08:15:24

问题可能是因为树不平衡。这意味着在最坏的情况下,调用堆栈将包含与树中的项数相同的函数调用数。每次插入后,您应该检查树的平衡,如果有必要纠正它。

此外,您还可以将insert函数除以:

  1. 查找将成为父节点的节点
  2. 添加新节点

然后优化find函数(只需搜索“最左边”/“最右边”)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26825566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档