2015-01-21 40 views
-3

首先,我并不陌生于C或C++。不过,我目前正在Mac Yosemite上使用C++。我只是试图编写一个递归函数来返回两个节点的共同祖先,这些节点由其关键(数据)变量标识。逻辑很简单,遍历树直到两个节点都在同一个分支中,这些节点发散的节点是共同的祖先。有了这个想法,我想出了以下代码:我的C++代码有什么问题?最少见的祖先

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设置做些什么吗?我的逻辑错了吗?

+4

难道把在return语句最后修复错误? – BWG 2015-01-21 02:47:57

+0

是的,它让我编译但不会返回正确的节点。它返回t他根源......在这种情况下。 – 2015-01-21 03:41:20

回答

0

这是因为返回总是在IF语句中,所以它们可能不会被调用...所以解决方案应该在函数结束时调用return,如果它进入任何IF(带NULL或值你要)。

1

这是因为您忘记了返回递归调用返回的值。并且在最后添加一个返回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; 
} 
+0

请阅读我的整篇文章。正如我在文章中提到的,我也尝试添加return语句 - NULL。在这种情况下,返回的函数只返回NULL。但是,当我添加cout进行调试时,控制流程似乎很好......! – 2015-01-21 03:43:50

+0

嗯,阅读我的整个答案:)你是否尝试在commonAncestor调用前添加return语句,正如我所建议的那样?另外,对于其中一个节点是另一个节点的祖先的情况,我建议在第一个分支中返回'n'而不是'NULL'。 – Ishamael 2015-01-21 05:18:49

0

编译器不会高兴,除非它是一定会有所作为,无论返回什么(即使你的,如果我们以所有可能的情况下照顾。最后,在那里你假设你的代码将永远无法达到,只是抛出一个return NULL;,它会很高兴。

而且,我可能是错的,但我相信你也想回在你的最后两个IFS递归调用commonAncestor结果。

+0

我已经试过返回NULL,在这种情况下,该函数将只返回NULL。 – 2015-01-21 03:44:31