0

我的二叉搜索树中的递归函数存在很大问题。我的项目将在几个小时后到期,我终生无法联系到我的导师。

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

赋值运算符:

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

4 回答 4

4

你的问题就在这里:

if(c->left != nullptr)
    preORet(c->left);
else if(c->right != nullptr)
    preORet(c->right);

你不想要一个else if. 无论左子树是否为 nullptr,您都想遍历右子树。

于 2013-11-09T02:06:25.023 回答
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);
    }
}

这样,在使用每个指针之前都会检查它是否为空,包括左指针和右指针。如果它为空,它只会通过,超出范围。

于 2018-01-28T15:36:43.087 回答
0

去掉 preORet() 中的 else。

于 2013-11-09T02:06:30.793 回答
0

摆脱那个else

乍一看,你的设计看起来很容易moveswap有能力,我会使用复制swap习语来生成一个相当有效、易于编写的operator=.

但是,这只是我。

于 2013-11-09T02:09:30.460 回答