已知一颗树的节点间关系,请编程实现该树的先根遍历。 输入 若干行,每行描述了一组双亲节点和孩子节点的关系序偶对(每个节点用不同的大写字母表示,节点小于26个)。且树的度小于5。 输出 该树的先根遍历序列,序列中每个字母用空格隔开。 样例输入 复制 B E B F A B A C,用C++实现
时间: 2024-03-17 09:41:29 浏览: 74
根据输入描述,我们可以先将节点间的关系建立成一个以父节点为键,孩子节点列表为值的哈希表。然后使用递归的方式实现树的先根遍历。具体步骤如下:
1. 找到根节点,即在哈希表中没有作为孩子出现过的节点。
2. 访问根节点。
3. 遍历根节点的每个子节点,对于每个子节点,递归地进行先根遍历。
4. 重复步骤2和3,直到遍历完所有节点。
下面是使用 C++ 实现的代码:
```cpp
#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
using namespace std;
void build_tree(unordered_map<char, vector<char>>& tree) {
string line;
while (getline(cin, line)) {
if (line.empty()) {
break;
}
char parent = line[0];
char child = line[2];
tree[parent].push_back(child);
}
}
void preorder_traversal(const unordered_map<char, vector<char>>& tree, char node) {
auto it = tree.find(node);
if (it == tree.end()) {
return;
}
cout << node << ' ';
for (char child : it->second) {
preorder_traversal(tree, child);
}
}
int main() {
unordered_map<char, vector<char>> tree;
build_tree(tree);
for (auto& kv : tree) {
for (char child : kv.second) {
tree[child]; // 将所有的孩子节点加入哈希表中
}
}
for (auto& kv : tree) {
if (kv.second.empty()) {
preorder_traversal(tree, kv.first);
break;
}
}
return 0;
}
```
对于输入样例 B E B F A B A C,该程序的输出为:
```
A B E F C
```
阅读全文