从递归函数返回值

时间:2013-07-27 08:59:33

标签: c++ recursion tree

另一个递归问题,抱歉只是无法理解这一点。我正在尝试返回一个id与所提供的id匹配的节点指针。我想我正在穿越树。我在这里错的任何想法?

//h
Node* findNode(const QString &id, Node *node=NULL)

//cpp
Node* Tree::findNode(const QString &id, Node *node)
{
    if (node == NULL)
        node = root;

    for(int i = 0, end = node ? node->childCount() : -1; i < end ; i++)
    {
        QString nodeId = node->child(i)->id();

        if (nodeId == id)
        {
            return node;
        }
        else
        {
            return findNode(id, node->child(i));
        }
    }
}

感谢您寻找

4 个答案:

答案 0 :(得分:4)

else中,只有在找到内容时才返回递归调用的值。否则,您永远不会超过i=0

答案 1 :(得分:3)

我很确定你需要这样的东西:

 ...
 else
 {
     Node *temp = findNode(id, node->child(i));
     if (temp) return temp;
 }

实际上,它在到达循环结束之前就会返回。

此外,您需要在功能结束时返回NULL(或更好,nullptr):

// At the end
return NULL;

答案 2 :(得分:1)

else return findNode(id, node->child(i));`

这将导致第一个子树(子)的遍历。

我宁愿写这样的东西,以便按顺序遍历所有子树,直到找到某些东西。如果找不到任何内容,请返回nullptr

Node *find(Node *tree, string id)
{
    if (tree->id == id)
        return tree;

    Node *ptr = nullptr;
    for (int i = 0; i < tree->childCount; i++)
        if ((ptr = find(node->children[i], id)) != nullptr)
            return ptr;

    return nullptr;
}

答案 3 :(得分:0)

您似乎只进行深度优先搜索,并返回最左侧叶节点的结果。

在findNode(id,node-&gt; child(i))中;你永远不会检查它是否返回NULL。

如果孩子的返回值不是NULL(你实际上找到了什么),那么只从那里返回,否则,继续循环(现在,你只看第一个元素)。

然后,在循环之后,如果没有找到任何内容(还没有返回),则返回NULL。