Прежде чем подавать вам код, чтобы решить вашу проблему, я хотел бы сыграть в игру с мыслями. Посмотрите на следующее изображение, которое представляет как рекурсия должна сматываться для ввода
Study изображение и обратите внимание, как рекурсии только начинается, когда есть дети, для конкретного узла (и что они в последний раз для количество детей, указанных на входе).
Попробуйте придумать код (или псевдокод) на бумаге.
Код для решения этого довольно проста: использовать vector<Node>
для хранения ваших детей
#include <iostream>
#include <vector>
using namespace std;
struct Node {
Node(int v) : val(v) {}
int val;
vector<Node*> children;
};
Node *readTreeNode() {
int val, children;
cin >> val >> children;
Node *node = new Node(val);
for (int i = 0; i<children; ++i)
node->children.push_back(readTreeNode());
return node;
}
int main() {
Node *root = readTreeNode();
// Do the cleanup..
return 0;
}
Live Example
Обратите внимание на цикл, где функция readTreeNode()
рекурсивно называется
for (int i = 0; i<children; ++i)
node->children.push_back(readTreeNode());
Внутренние дети обрабатываются перед остальными.
Итоговые предостережений:
Я не реализовать обработку памяти (код выше утечки памяти). Будьте хорошим гражданином и освободите выделенную память или, еще лучше, используйте интеллектуальные указатели.
Там нет обработки ошибок (то есть никакой проверки ввода не узлы эффективно быть введены)
Добро пожаловать в StackOverflow. Почему бы вам не попробовать сначала. И когда вы застряли, вернитесь на сайт и задайте конкретные вопросы о своем коде. –