我要为类做这个项目,在这个项目中,我必须向二进制搜索树中添加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: 0xC00000FD中0x7717CF87 (ntdll.dll)处未处理的异常:堆栈溢出(参数: 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;
}发布于 2014-11-09 08:15:24
问题可能是因为树不平衡。这意味着在最坏的情况下,调用堆栈将包含与树中的项数相同的函数调用数。每次插入后,您应该检查树的平衡,如果有必要纠正它。
此外,您还可以将insert函数除以:
然后优化find函数(只需搜索“最左边”/“最右边”)。
https://stackoverflow.com/questions/26825566
复制相似问题