这道题就是根据给定的数据建立一棵树,然后从上到下、从左到右输出这棵树的叶子节点,属于基础题。 如果做过树的一些题,这道题的“种树”(构建树)应该会很简单:只需要按顺序建立一个结构体数组,在每个结构体中保存左右节点的下标。同时看哪一个节点没有被输入过,即是树的根节点(输入的节点是不同节点的孩子节点,只有根节点没有父节点)。 后面也很简单,只需要找出所有叶子节点,然后根据题目“in the order of top down, and left to right”的要求使用BFS,遍历过程中按顺序输出这些叶子节点即可。
using node = struct Node; using tree = node * ; structNode { int left; int right; };
int root = -1; vector<int> leaf;
vector<tree> create(){ int n; cin >> n; vector<tree> nodes; vector<int> isRoot; for (auto i = 0; i < n; i++) isRoot.push_back(1);
for (auto i = 0; i < n; i++) { char a, b; int left, right; cin >> a >> b;
if (a == '-') left = -1; else { left = a - '0'; isRoot[left] = 0; } if (b=='-') right = -1; else { right = b - '0'; isRoot[right] = 0; } if (a=='-'&& b=='-') { leaf.push_back(i); }
tree temp = new node; temp->left = left; temp->right = right; nodes.push_back(temp); }
for (auto i = 0; i < n; i++) { if (isRoot[i] == 1) { root = i; break; } } return nodes; }
voidBFS(vector<tree> nodes){ queue<int> que; que.push(root); bool first = 1; while (!que.empty()) { //弹出 int f = que.front(); que.pop();
//处理 for (auto x:leaf) { if (x == f) { if (!first) { cout << " "; } else { first = 0; } cout << x; break; } }
//将左右节点加入队列 if (-1 != nodes[f]->left) { que.push(nodes[f]->left);
} if (-1 != nodes[f]->right) { que.push(nodes[f]->right);