我的二叉搜索树中的递归函数存在很大问题。我的项目将在几个小时后完成,我不能在我的生活中得到我的导师。
我的功能似乎只是遍历我树的最左边的分支。
分配操作员:
template<typename Type>
BST<Type>& BST<Type>::operator=(const BST& that)
{
if(this != &that)
{
this->clear();
Node *c = that.root;
preORet(c);
}
return *this;
}
被称为递归函数:
template<typename Type>
void BST<Type>::preORet(Node *c)
{
this->insert(c->data);
if(c->left != nullptr)
preORet(c->left);
else if(c->right != nullptr)
preORet(c->right);
}
顺便说一句,我知道很多这可能看起来像严重的混淆代码,但这是我的教师期望它看起来的样子。
提前谢谢。
答案 0 :(得分:3)
你的问题就在这里:
if(c->left != nullptr)
preORet(c->left);
else if(c->right != nullptr)
preORet(c->right);
您不需要else if
。无论左子树是否为nullptr,您都希望遍历正确的子树。
答案 1 :(得分:1)
除了在else
函数中取出preORet()
之外,正如其他人所指出的那样,如果您碰巧遇到分段错误(错误代码11),也值得注意通过参数Node *c
传入空指针。
这是一个解决方案:
template<typename Type>
void BST<Type>::preORet(Node *c)
{
if (c != nullptr)
{
this->insert(c->data);
preORet(c->left);
preORet(c->right);
}
}
这样,每个指针都被检查以查看它在使用前是否为空,包括左右指针。如果它为null,它将会超出范围。
答案 2 :(得分:0)
摆脱preORet()中的else。
答案 3 :(得分:0)
摆脱else
。
正如您的设计看起来,乍一看,要轻松move
或swap
,我会使用副本 - swap
成语来生成一个合理有效,易于编写{ {1}}。
但那只是我。