2016-11-09 2 views
-2

У меня есть функция, чтобы найти узел в BST своим строковым ключом, используя рекурсию. Я получаю предупреждение для второй функции: c4715 «не все пути управления возвращают значение». Я не могу понять, что именно путь не возвращает значение ..Какой путь не возвращает значение?

Вот мои функции:

TreeNode* Tree::findNodeByKey(const string &str) { 
    if (root == NULL) { 
     cout << "Tree is empty, nothing found" << endl; 
     return nullptr; 
    } 

    else { 
     return findNodeByKeyHelper(root, str); 
    } 
} 

TreeNode* Tree::findNodeByKeyHelper(TreeNode *node, const string &str) { 
    if (node->data == str) { 
     cout << "node is found" << endl; 
     return node; 
    } 
    else if (str < node->data) { 
     if (node->left == nullptr) { 
      cout << "element was not found" << endl; 
      return nullptr; 
     } 
     else { 
      findNodeByKeyHelper(node->left, str); 
     } 
    } 
    else if (str > node->data) { 
     if (node->right == nullptr) { 
      cout << "element was not found" << endl; 
      return nullptr; 
     } 
     else { 
      findNodeByKeyHelper(node->right, str); 
     } 
    } 
} 
+1

Не все шаблоны в 'Tree :: findNodeByKeyHelper()' возвращают значение, очевидно. –

+1

"* не все пути управления возвращают значение *". Найдите путь, который не заканчивается оператором 'return'. – juanchopanza

+0

Я просто не понимаю, где я не возвращаю значение. В этом проблема, иначе я бы не стал задавать этот вопрос. – kekyc

ответ

2

Эти пути

else if (str < node->data) { 
    if (node->left == nullptr) { 
     cout << "element was not found" << endl; 
     return nullptr; 
    } 
    else { 
     findNodeByKeyHelper(node->left, str); 
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    } 
} 
else if (str > node->data) { 
    if (node->right == nullptr) { 
     cout << "element was not found" << endl; 
     return nullptr; 
    } 
    else { 
     findNodeByKeyHelper(node->right, str); 
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    } 
} 

возвращение ничего.

Необходимо добавить ключевое слово return. Например

 return findNodeByKeyHelper(node->right, str); 

И заменить последний else-if для else. Например,

if (node->data == str) { 
    //... 
} 
else if (str < node->data) { 
    //... 
} 
else { 
^^^^^^^ 
    //... 
} 
+0

Ох. Ты, конечно, прав, большое спасибо! Но, как я думал, моя рекурсия должна закончиться в случае, если «элемент не был найден» или «узел был найден». Я прав? – kekyc

+1

@kekyc На некотором уровне поиска функция действительно вернет либо узел, либо nullpt к предыдущему уровнюr. Но на предыдущем уровне функция ничего не вернет. –

+0

Действительно ... Спасибо за ваше объяснение! :) – kekyc

Смежные вопросы