【问题标题】:binary search tree assignment operator二叉搜索树赋值运算符
【发布时间】:2013-11-21 04:48:33
【问题描述】:

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

我的函数似乎只遍历树的最左边的分支。

赋值运算符:

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

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

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

    你的问题就在这里:

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

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

    【讨论】:

      【解决方案2】:

      去掉 preORet() 中的 else。

      【讨论】:

        【解决方案3】:

        摆脱那个else

        乍一看,您的设计看起来很容易moveswap 能够,我会使用copy-swap 习惯用法来生成一个相当高效、易于编写的operator=

        但那只是我。

        【讨论】:

          【解决方案4】:

          除了在你的preORet() 函数中取出else 之外,正如其他人所指出的那样,还值得注意的是,如果你碰巧传入一个空值,你会得到一个分段错误(错误代码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);
              }
          }
          

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

          【讨论】:

            猜你喜欢
            • 2023-03-07
            • 2016-05-08
            • 1970-01-01
            • 2019-08-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-08
            相关资源
            最近更新 更多