请不使用#include <unordered_map>编译
时间: 2023-08-02 21:36:46 浏览: 90
好的,以下是不使用 `unordered_map` 的实现代码:
```cpp
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MAXN = 26;
vector<int> graph[MAXN]; // 存储树的关系图
bool visited[MAXN]; // 标记节点是否已经被访问
// 先根遍历函数
void preOrder(int node) {
if (!visited[node]) { // 如果该节点没有被访问
visited[node] = true; // 标记为已访问
cout << char(node + 'A') << " "; // 输出该节点
for (int i = 0; i < graph[node].size(); ++i) { // 遍历该节点的所有子节点
preOrder(graph[node][i]); // 递归遍历子节点
}
}
}
int main() {
char parent, child;
memset(visited, false, sizeof(visited)); // 初始化visited数组
while (cin >> parent >> child) { // 读入树的关系序偶对
graph[parent - 'A'].push_back(child - 'A'); // 添加节点之间的关系
}
for (int i = 0; i < MAXN; ++i) { // 找到根节点
if (graph[i].size() > 0 && !visited[i]) {
preOrder(i); // 从根节点开始先根遍历整棵树
}
}
cout << endl;
return 0;
}
```
这里我们使用一个二维向量 `graph` 存储整棵树的关系图。对于每一对双亲节点和孩子节点的关系,我们都将孩子节点的编号添加到双亲节点的子节点列表中。
同时,我们使用一个布尔数组 `visited` 标记每个节点是否已经被访问。在先根遍历函数 `preOrder` 中,我们从根节点开始遍历整棵树。对于每个节点,我们先判断它是否已经被访问,如果没有被访问,则输出该节点,标记为已访问,并递归遍历该节点的子节点。
最后,在主函数中,我们扫描所有的节点,找到有孩子节点但没有被访问的节点,作为根节点开始先根遍历整棵树。注意,这里我们将节点编号转换成大写字母输出。
阅读全文