题目描述 已知一颗树的节点间关系,请编程实现该树的先根遍历。 输入 若干行,每行描述了一组双亲节点和孩子节点的关系序偶对(每个节点用不同的大写字母表示,节点小于26个)。且数的度小于5。 输出 该树的先根遍历序列,序列中每个字母用空格隔开。 样例输入 复制 B E B F A B A C用c++
时间: 2024-03-10 12:44:25 浏览: 85
以下是C++语言的实现代码:
```cpp
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
unordered_map<char, vector<char>> graph; // 存储树的关系图
unordered_map<char, bool> visited; // 标记节点是否已经被访问
// 先根遍历函数
void preOrder(char node) {
if (!visited[node]) { // 如果该节点没有被访问
visited[node] = true; // 标记为已访问
cout << node << " "; // 输出该节点
for (char child : graph[node]) { // 遍历该节点的所有子节点
preOrder(child); // 递归遍历子节点
}
}
}
int main() {
char parent, child;
while (cin >> parent >> child) { // 读入树的关系序偶对
graph[parent].push_back(child); // 添加节点之间的关系
}
for (auto p : graph) { // 找到根节点
if (!visited[p.first]) {
preOrder(p.first); // 从根节点开始先根遍历整棵树
}
}
cout << endl;
return 0;
}
```
首先,我们使用一个无序字典 `graph` 存储整棵树的关系图。对于每一对双亲节点和孩子节点的关系,我们都将孩子节点添加到双亲节点的子节点列表中。
然后,我们使用另一个无序字典 `visited` 标记每个节点是否已经被访问。在先根遍历函数 `preOrder` 中,我们从根节点开始遍历整棵树。对于每个节点,我们先判断它是否已经被访问,如果没有被访问,则输出该节点,标记为已访问,并递归遍历该节点的子节点。
最后,在主函数中,我们扫描所有的节点,找到没有被访问的节点,作为根节点开始先根遍历整棵树。
阅读全文