二叉搜索树赋值运算符

时间:2013-11-09 02:04:26

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

我的二叉搜索树中的递归函数存在很大问题。我的项目将在几个小时后完成,我不能在我的生活中得到我的导师。

我的功能似乎只是遍历我树的最左边的分支。

分配操作员:

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

顺便说一句,我知道很多这可能看起来像严重的混淆代码,但这是我的教师期望它看起来的样子。

提前谢谢。

4 个答案:

答案 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

正如您的设计看起来,乍一看,要轻松moveswap,我会使用副本 - swap成语来生成一个合理有效,易于编写{ {1}}。

但那只是我。