2017-08-21 9 views
-1

に置か復帰後に終了していないノードの定義されています機能は、ここで条件

Node::Node(int value, Node* left, Node* right) { 
    this->value = value; 
    this->left = left; 
    this->right = right; 
} 

int Node::getValue() const { 
    return value; 
} 

Node* Node::getLeft() const { 
    return left; 
} 

Node* Node::getRight() const { 
    return right; 
} 

そして、ここでは機能が含まれています

static bool contains(const Node& root, int value) 
{ 
    cout << "Root value: " << root.getValue() << endl; 
    if(root.getValue() == value) 
    { 
     cout << "You entered." << endl; 
     return true; 
    } 
    else if(root.getLeft() != NULL) 
    { 
     cout << "Left tree: " << endl; 
     contains(*(root.getLeft()), value); 
    } 
    else if(root.getRight() != NULL) 
    { 
     cout << "Right tree: " << endl; 
     contains(*(root.getRight()), value); 
    } 

    cout << "End" << endl; 
    return false; 
} 

今、私はこの機能を使用します。

Node n1(1, NULL, NULL); 
Node n3(3, NULL, NULL); 
Node n2(2, &n1, &n3); 

cout << "Contains? " << contains(n2, 1) << endl; 

この1の値は左のサブツリーにあります。 「入力しました」と表示されます。結果として0を表示する関数の最後に行く。なぜ1(真)を表示しないのですか?私は何を取りこぼしたか?

+6

重要な2つの「リターン」キーワードがありません。 '*(root.getLeft())、value);' –

答えて

2

一部のリターンステートメントがありません。

cout << "Root value: " << root.getValue() << endl; 

if(root.getValue() == value) 
{ 
    cout << "You entered." << endl; 
    return true; 
} 
else if(root.getLeft() != NULL) 
{ 
    cout << "Left tree: " << endl; 
    contains(*(root.getLeft()), value); // no return here 
} 
else if(root.getRight() != NULL) 
{ 
    cout << "Right tree: " << endl; 
    contains(*(root.getRight()), value); // and no return here 
} 

cout << "End" << endl; 
return false; 

ツリーにはどこかの値が含まれていますが、netherは結果を外部に伝えているかどうかをチェックします。

if (root.getValue() == value) 
{ 
    cout << "You entered." << endl; 
    return true; 
} 
auto left = root.getLeft(); 
if (left) 
{ 
    cout << "Checking Left tree: " << endl; 
    if (contains(*left, value)) 
     return true; 
} 
auto right = root.getRight(); 
if (right) 
{ 
    cout << "Checking Right tree: " << endl; 
    if (contains(*right, value)) 
     return true; 
} 

cout << "End" << endl; 
return false; 

に変更してください。

+1

これは左のサブツリーがあればそれを見てスキップしますそれが左に見つからない場合は右 – sp2danny

+0

はい、私は今それを見る。私は3つの値のためにそれをテストし、それは動作しません。 – pochmurnik

+0

@ sp2danny編集していただきありがとうございます。私はちょうど私の自己;-)を修正するために遅くする瞬間だった – muXXmit2X