Для начала я не новичок в C или C ++. Тем не менее, в настоящее время я работаю с C ++ на Mac Yosemite. Я просто пытаюсь написать рекурсивную функцию, которая возвращает общих предков двух узлов, которые идентифицируются по их ключевой (data) переменной. Логика проста: обходить дерево до тех пор, пока оба узла не окажутся в одной ветви, узел, где эти узлы расходятся, является общим предком. С этим умом я придумал следующий код:
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"
Это странно, так как у меня есть ответные заявления. Кроме того, чтобы избежать этой ошибки, я попытался добавить оператор возврата в конце, который возвращал только корневой узел. Я запутался … Должен ли я что-то сделать с настройками XCode? Моя логика неверна?
Это потому, что вы забыли вернуть значение, возвращаемое вашими рекурсивными вызовами. А также добавить возврат NULL
в конце, поскольку компилятор не обязательно знает, что конец функции недоступен.
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;
}
Это связано с тем, что возвращаемые значения всегда находятся внутри операторов IF, чтобы их нельзя было вызывать … Поэтому решение должно вызывать return также в конце функции, если она входит в какой-либо IF (с NULL или желаемым значением).
Компилятор не будет счастлив, если не будет уверен, что что-то будет возвращено, несмотря ни на что (даже если ваш if позаботится обо всех возможных сценариях. В конце, где вы предполагаете, что ваш код никогда не достигнет, просто бросьте return NULL;
и будет рад.
Кроме того, я могу ошибаться, но я считаю, что вы также хотите вернуть результат рекурсивного вызова commonAncestor в ваших последних двух ifs.