2017-03-14 7 views
-3

ノードキーに対応する値が見つかったら、そのノードを呼び出された場所に戻すだけです。私cout文に基づいてどのようにして再帰アルゴリズムからノー​​ドを返すことができますか?

MovieNode *found = searchRecursive(root, title); 

、それが発見されたばかりですが、私はmain()に戻ってそれを印刷するとき、私はちんぷんかんぷんを取得しています。興味深いことに、ノードがmain()に印刷されているときにはヌルではありませんが、疑問符のアイコンは何度も何回か印刷されています。機能

return nullptr; 

の終わりに

auto* r = searchRecusive(...) 
if (r) return r; 

ので、あなたが得る::他のいくつかのと

MovieNode* MovieTree::searchRecursive(MovieNode* node, std::string const& value) { 
    if(node->left != nullptr) { 
    auto* r = searchRecursive(node->left, value); 
    if (r) return r; 
    } 

    if(node->title == value){ //in order 
    std::cout<<"found\n"; 
    std::cout<<node->title<<std::endl; 
    return node; 
    } 

    if(node->right != nullptr) { 
    auto* r = searchRecursive(node->right, value); 
    if (r) return r; 
    } 
    return nullptr; 
} 

をだけではなくsearchRecursive(...)これを行う呼び出しの

struct MovieNode{ 
    int ranking; 
    std::string title; 
    int year; 
    int quantity; 
    MovieNode *parent; 
    MovieNode *left; 
    MovieNode *right; 

    MovieNode(){}; 

    MovieNode(int in_ranking, std::string in_title, int in_year, int in_quantity) 
    { 
     ranking = in_ranking; 
     title = in_title; 
     year = in_year; 
     quantity = in_quantity; 
     parent = NULL; 
     left = NULL; 
     right = NULL; 
    } 
}; 

MovieNode* MovieTree:: searchRecursive(MovieNode *node, std::string value) 
{ 
    if(node->left != NULL){ 
     searchRecursive(node->left, value); 
    } 

    if(node->title == value){ //in order 
     cout<<"found"<<endl; 
     cout<<node->title<<endl; 
     return node; 
     } 

    if(node->right != NULL){ 
     searchRecursive(node->right, value); 
    } 
} 
+0

無料の手掛かり:どのような機能から何かをどうやって返すのですか?再帰関数については忘れてください。私たちは何らかの機能について話しており、どのようにして関数を返すのかについて話しています。再帰関数については特別なことも魔法もありません。それらは、非再帰関数*が何かを返すものと全く同じように何かを返します。だから、あなたは関数から何かを返すでしょうか?この質問に答えると、どのように関数から何かを返す*あなたはあなたが逃しているものを把握することができます。 –

+0

それが返品を追加するという私の嫌な呼びかけだった場合、それはifステートメントの中にあります。 – user7554736

+0

ifステートメントでは、これはリストを一番左のアイテムにトラバースするだけでなく、そのアイテムがあなたの望む値でない場合は、毎回繰り返されるほとんどの左から左のリスト項目の間を行き来します。 – Tuffwer

答えて

0

あなたの関数の実装は、未定義の動作をしています。まず第一に、ノードはnullptrと等しくなり、第二にいくつかのパスの関数は何も返しません。

機能は、私は木がデータメンバのタイトルに従って順序付けされていると、次のよう

MovieNode * MovieTree::searchRecursive(MovieNode *node, const std::string &value) 
{ 
    if (node) 
    { 
     if (value < node->title) 
     { 
      node = searchRecursive(node->left, value); 
     } 
     else if (node->title < value) 
     { 
      node = searchRecursive(node->right, value); 
     } 
    } 

    return node; 
} 

を定義することができます。

+1

なぜ木は選別されたと思いますか? – Yakk

+0

@Yakk私はソートされていないツリーを定義する感覚はありません。 –

+0

主な違いはnode = searchRecusiveでした。以前の課題では、何かを直接自分に戻さなくても再帰的にできるようになりました。違いは、それが空の再帰アルゴリズムであったことです。 – user7554736

3

マイナーな修正。

+0

最初の部分はどこに行きますか?わかりません。これはおそらく下落してしまいますが、わかりません。私は今あなたの編集を見る。 – user7554736

+0

新しいエラー。 Autoはコードブロックの型ではありません – user7554736

+0

@ user7554736 C++ 11または14でコンパイルできます。それは2017です。 '-std = C++ 11'はgcc/clangで動作します。 – Yakk

関連する問題