【问题标题】:what is wrong in my C++ code? Least Common ancestor我的 C++ 代码有什么问题?最小共同祖先
【发布时间】:2015-01-21 02:44:26
【问题描述】:

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

【问题讨论】:

  • 将return语句放在最后是否修复了错误?
  • 是的,它让我编译但不会返回正确的节点。它正在返回根......在这种情况下。

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


【解决方案1】:

那是因为您忘记返回递归调用返回的值。并且还要在末尾添加一个 return 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;
}

【讨论】:

  • 请阅读我的整个帖子。正如我在帖子中提到的,我确实尝试添加 return 语句 - NULL,以及。在这种情况下,返回的函数只返回 NULL。但是,当我添加 couts 进行调试时,控制流似乎很好......!
  • 好吧,阅读我的全部答案 :) 您是否按照我的建议尝试在 commonAncestor 调用之前添加 return 语句?此外,对于其中一个节点是另一个节点的祖先的情况,我建议在第一个分支中返回 n 而不是 NULL
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    除非确定无论如何都会返回某些内容,否则编译器不会高兴(即使您的 if 处理了所有可能的情况。最后,您认为您的代码永远不会到达,只需抛出一个 @ 987654321@,它会很开心。

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

    【讨论】:

    • 我已经尝试返回NULL,在这种情况下,函数将只返回NULL。
    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 2017-05-02
    相关资源
    最近更新 更多