-3

そもそも、私は C や C++ を初めて使用するわけではありません。ただし、現在 Mac Yosemite で C++ を使用しています。キー (データ) 変数によって識別される 2 つのノードの共通の祖先を返す再帰関数を作成しようとしています。ロジックは単純で、両方のノードが同じブランチに入るまでツリーをトラバースします。これらのノードが分岐するノードが共通の祖先になります。これを念頭に置いて、次のコードを思いつきました。

Node * commonAncestor(Node *n, int left_elem, int right_elem)
{
    if (n == NULL || n->key()==left_elem || n->key() == right_elem){return NULL;}
    if (left_elem < n->key() && right_elem > n->key()) {return n;}
    if (left_elem > n->key() || right_elem < n->key()) {
        cout<<"\n...Consider changing the order of the elements"<<endl;
    }
    if (left_elem < n->key() && right_elem < n->key()) {
        commonAncestor(n->Left(), left_elem, right_elem);
    }
    if (left_elem > n->key() && right_elem > n->key()) {
        commonAncestor(n->Right(), left_elem, right_elem);
    }
}

私は働くべきです、私は同様のプログラムを行ってきました。ただし、プログラムはコンパイルされません。コンパイラエラーが発生"control may reach end of non-void function" します return ステートメントがあるため、これは奇妙です。また、このエラーを回避するために、ルート ノードのみを返す return ステートメントを最後に追加してみました。私は混乱しています... XCodeの設定で何かをする必要がありますか? 私の論理は間違っていますか?

4

3 に答える 3

1

これは、再帰呼び出しによって返された値を返すのを忘れたためです。またNULL、コンパイラは関数の最後に到達できないことを必ずしも認識していないため、最後に return を追加します。

Node * commonAncestor(Node *n, int left_elem, int right_elem)
{
    if (n == NULL || n->key()==left_elem || n->key() == right_elem){return NULL;}
    if (left_elem < n->key() && right_elem > n->key()) {return n;}
    if (left_elem > n->key() || right_elem < n->key()) {
        cout<<"\n...Consider changing the order of the elements"<<endl;
        return NULL;
    }
    if (left_elem < n->key() && right_elem < n->key()) {
        return commonAncestor(n->Left(), left_elem, right_elem);
    }
    if (left_elem > n->key() && right_elem > n->key()) {
        return commonAncestor(n->Right(), left_elem, right_elem);
    }

    return NULL;
}
于 2015-01-21T02:50:10.227 に答える
0

これは、戻り値が常に IF ステートメント内にあるため、呼び出すことができないためです... したがって、解決策は、IF 内に入る場合 (NULL または必要な値を使用)、関数の最後でも return を呼び出す必要があります。

于 2015-01-21T02:49:59.820 に答える
0

何があっても何かが返されることが確実でない限り、コンパイラは満足しません(ifが考えられるすべてのシナリオを処理している場合でも)return NULL;。ハッピー。

また、私は間違っているかもしれませんが、最後の 2 つの if で commonAncestor を再帰的に呼び出した結果も返したいと考えています。

于 2015-01-21T02:51:29.827 に答える