Рекурсию может быть сложно объяснить, но я постараюсь объяснить, как она применяется в этой ситуации. Поскольку вы можете рекурсивно проверять, существует ли каждый узел, вы захотите вернуть идентификатор в качестве возвращаемой строки. Это уведомляет рекурсивный стек, что совпадение было найдено. Затем вы добавляете идентификатор текущего узла в строку и возвращаете его в стек. Это в свою очередь уведомляет стек, что найдено совпадение и т. Д. Вот мое решение, в которое я добавил несколько комментариев, чтобы лучше проиллюстрировать эту точку.
// 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();
}
Большинство рекурсивных функций следуют похожему шаблону. Если вы все еще немного потерялись, я бы порекомендовал запустить его через отладчик, чтобы вы могли точно видеть, что происходит.