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 に答える
0

それを取り除くelse

あなたのデザインは一見、簡単にmove、またはswapできるように見えるので、コピーswapイディオムを使用して、合理的に効率的で書きやすいoperator=.

しかし、それは私だけです。

于 2013-11-09T02:09:30.460 に答える
0

preORet() の else を取り除きます。

于 2013-11-09T02:06:30.793 に答える