二进制搜索树递归插入导致堆栈溢出,迭代插入不起作用

时间:2014-11-09 06:14:42

标签: c++ recursion iteration binary-search-tree

我有这个项目要为类做,我必须在二元搜索树中添加10000个元素(按顺序) - 除此之外,但这不是目前已经破坏的内容。我的递归插入工作正常,直到大约3500个元素,然后它会中断并导致堆栈溢出。然后我尝试创建代码的迭代版本,但它只添加了元素9999和10000.所以我的问题:

如何使递归插入适用于大量已排序的元素? 或者我如何让我的迭代插入工作呢?

我的代码在这里:

递归:

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);
}

迭代:

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;
    }
}

此外,如有必要,请参阅我的公开插入功能:

template <typename T>
void BST<T>::insert(T data)
{
    insert(mRootNode, data); //insertIterative(mRootNode, data);
}

最后,这是我的递归代码中断时出现的错误:

  

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

我的BST_Node构造函数:

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建设者:

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;
}

1 个答案:

答案 0 :(得分:3)

问题可能是因为树没有平衡。这意味着在最坏的情况下,调用堆栈将包含与树中项目数相同数量的函数调用。每次插入后,您应该检查树的平衡以及是否需要更正它。

您也可以将插入功能分开:

  1. 查找将成为父
  2. 的节点
  3. 添加新节点
  4. 然后优化查找功能(只需谷歌&#34;最左边&#34; /&#34;最右边&#34;)。