题目描述 已知一颗树的节点间关系,请编程实现该树的后根遍历序列。 输入 若干行,每行描述了一组双亲节点和孩子节点的关系序偶对(每个节点用不同的大写字母表示,节点小于26个)。且树的度小于5。 输出 该树的后根遍历序列,序列中每个字母用空格隔开。 样例输入 复制 B E B F A B A C 样例输出 复制 E F B C A
时间: 2024-03-10 14:44:35 浏览: 93
以下是C++语言的实现代码:
```cpp
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MAXN = 26;
vector<int> graph[MAXN]; // 存储树的关系图
bool visited[MAXN]; // 标记节点是否已经被访问
// 后根遍历函数
void postOrder(int node) {
if (!visited[node]) { // 如果该节点没有被访问
visited[node] = true; // 标记为已访问
for (int i = 0; i < graph[node].size(); ++i) { // 遍历该节点的所有子节点
postOrder(graph[node][i]); // 递归遍历子节点
}
cout << char(node + 'A') << " "; // 输出该节点
}
}
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]) {
postOrder(i); // 从根节点开始后根遍历整棵树
}
}
cout << endl;
return 0;
}
```
这里的实现和先根遍历类似,只需要将输出节点的位置放到递归遍历子节点之后即可。具体来说,在后根遍历函数 `postOrder` 中,我们遍历该节点的所有子节点,并递归遍历每个子节点,然后再输出该节点。
在主函数中,我们扫描所有的节点,找到有孩子节点但没有被访问的节点,作为根节点开始后根遍历整棵树。注意,这里我们将节点编号转换成大写字母输出。
阅读全文