另一个递归问题,抱歉只是无法理解这一点。我正在尝试返回一个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));
}
}
}
感谢您寻找
答案 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。