我的C ++代码有什么问题?最少共同的祖先

时间:2015-01-21 02:44:26

标签: c++ xcode macos c++11 least-common-ancestor

首先,我不是C或C ++的新手。但是,我目前正在Mac Yosemite上使用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" 这很奇怪,因为我有回复陈述。另外,为了避免这个错误,我尝试在最后添加一个return语句,它只返回根节点。我很困惑......我应该对XCode设置做些什么吗?我的逻辑错了吗?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

这是因为返回总是在IF语句中,因此它们可能不会被调用...所以解决方案应该是在函数末尾调用return,如果它进入任何IF(具有NULL或值)想)。

答案 2 :(得分:0)

编译器不会满意,除非确定无论什么都会返回(即使你的if会照顾所有可能的场景。最后,你假设你的代码永远不会到达,只需抛出一个{ {1}}它会很高兴。

另外,我可能错了,但我相信你也想在最后两个ifs中返回递归调用commonAncestor的结果。