0

私はこれで数時間頭を壁にぶつけてきました。どうすればいいのかわかりません。関数を何度か再構築しましたが、まだ正しく動作していません。

これは、私の C++ クラスでのプログラミング課題です。インストラクターが指定したデータ型、引数などのように、特定の形式が必要なので、そのようなものを変更することはできません。文字配列を使用する必要があるため、strcmp() を使用します。見つかった場合は人を返す必要があり、見つからない場合は NULL を返す必要があります。

私がこれまでに取り組んでいるものは次のとおりです。

person *classname::getPersonByName(char *name, person *rt)
{
    if (rt != NULL)
    {
        if (strcmp(rt->Title, title) == 0)
        {
            return rt;
        }
        else
        {
            getPersonByName(title, rt->left);
            getPersonByName(title, rt->right);
            //return NULL;
        }
    }
}

デバッグでは、名前で問題なく人を見つけて返します。問題は、それがすぐに私の返品を上書きしてしまい、正しい正しい人に行き着かないことです.

コメントアウトされている一番下の NULL は、検索で見つかったかどうかに関係なく、すべての呼び出しを NULL に設定することになります。

4

5 に答える 5

2

再帰が機能するには、関数の呼び出しから取得した値を返す必要があります。また、タイトルと名前を混在させているようです。

person * foundPerson = NULL;

else
{

     foundPerson = getPersonByName(title, rt->left);
     if(foundPerson != NULL) return foundPerson;
     return getPersonByName(title, rt->right);
     //return NULL;
} 
于 2012-08-01T02:10:01.227 に答える
2

問題は、再帰呼び出しから何も返さないことです。

このアイデアは実際には難しいことではありません。次の疑似コードを翻訳するだけです。

// This is mostly a procedural way from your method signature, though you are using C++...
Node getPersonByName(Node node, String name) {
    if (node is null) {
        return null
    }

    if (node.name == name) {
        return Node
    } 

    Node result = getPersonByName(node.left, name);
    if (result is not null) {  // found in node.left
        return result;
    }

    result = getPersonByName(node.right, name);
    if (result is not null) {  // found in node.right
        return result;
    }

    return null;
}

これを C/C++ に翻訳する宿題として残しておき、複数のリターン ポイントを回避することで構造の見栄えを良くします。

于 2012-08-01T02:13:55.120 に答える
1

このようにする必要があります(まず、渡した名前と比較します(それがあなたがやりたいことだと思います。次に、再帰が間違って書かれています。左右のサブツリーを再帰すると、Person*呼び出し元の親に返されます)関数であり、そこにも返す必要があります。) :

person *classname::getPersonByName(char *name, person *rt)
{
    if (rt == NULL)
        return NULL;
    if (strcmp(rt->Title, name) == 0)
    {
        return rt;
    }
    Person *left = getPersonByName(name, rt->left);
    if(left!=NULL )
        return left;
    Person *right = getPersonByName(name, rt->right);
    if(right!=NULL)
            return right;
    return NULL;
 }
于 2012-08-01T02:10:48.707 に答える
0

title再帰呼び出しと文字列テストに渡します。使用すべきではありませんnameか?それtitleが現在のノードの名前だと思います。

何のためのクラスclassnameですか?きっとあなたは次のようなことをしたでしょう:

person * person::findByName( char *name );
于 2012-08-01T02:10:23.393 に答える
0

久しぶりにツリー探索をしましたが、ツリーを
横断するなどのロジックがあります。ツリーは、すべての値がツリーの左側よりも小さく、値がツリーの右側よりも大きくなります。これは疑似コードです。ツリーをトラバースするためのアルゴリズムを調べたいと思うかもしれません。

while rt!=null
if name ==rt-> name return rt
else if name < rt->name then rt=rt->left //otherwise name is greater so on right side     

else rt=rt->right
end while

名前が見つかりません

于 2012-08-02T00:35:18.937 に答える