我有这个项目要为类做,我必须在二元搜索树中添加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;
}
答案 0 :(得分:3)
问题可能是因为树没有平衡。这意味着在最坏的情况下,调用堆栈将包含与树中项目数相同数量的函数调用。每次插入后,您应该检查树的平衡以及是否需要更正它。
您也可以将插入功能分开:
然后优化查找功能(只需谷歌&#34;最左边&#34; /&#34;最右边&#34;)。