假设我们有以下结构:
struct Tree {
string id;
int numof_children;
Tree *children[5];
};
...每个id都是唯一的(只能在树中出现一次),如何在这种树中找到id的路径并输出?
我知道如何到达节点并检查它是否存在,但我无法弄清楚如何输出正确的路径。
限制:不能使用矢量/列表/堆栈数据类型。仅递归。 建议:函数外观(ATree * t,string& id)应该具有字符串的返回类型。
我可以遵循一般的递归结构吗?
答案 0 :(得分:0)
递归可能很难解释,但我会尽力解释它在这种情况下是如何应用的。由于您能够以递归方式检查每个节点是否存在,因此您需要将id作为返回字符串返回。这通知递归堆栈已找到匹配。然后,将当前节点的id附加到字符串并将其返回到堆栈。这反过来通知堆栈已找到匹配等。这是我的解决方案,我添加了多个注释以更好地说明这一点。
// If found return [string] [of] [ids], else empty string
string look(const Tree * t, const string & id) {
// If current node matchs return id
if(t->id == id) {
return "[" + id + "]";
}
// Loop over each child, recursively calling look
for(int i=0; i<t->numof_children; i++) {
string s = look(t->children[i], id);
// If found add to string and return
if(!s.empty()) {
return "[" + t->id + "] " + s;
// alternatively: return s + " [" + t->id + "]"; will genreate string in reverse
}
}
// Not found, return empty string
return string();
}
大多数递归函数都遵循类似的模式。如果您仍然有点迷失,我建议您通过调试器运行它,以便您可以确切地看到发生了什么。