已知一颗树的节点间关系,请用c++编程实现该树的先根遍历。 输入:若干行,每行描述了一组双亲节点和孩子节点的关系序偶对(每个节点用不同的大写字母表示,节点小于26个)。且树的度小于5。 输出:该树的先根遍历序列,序列中每个字母用空格隔开。
时间: 2024-03-16 14:41:40 浏览: 85
可以通过定义一个 `Node` 结构体来表示树的节点,其中包括节点的值和孩子节点的指针数组,如下所示:
```cpp
struct Node {
char val; // 节点的值
vector<Node*> ch; // 孩子节点指针数组
Node(char v) : val(v) {}
};
```
然后,我们可以按照输入的关系序偶对构建这棵树,具体地,可以维护一个 `unordered_map<char, Node*>`,表示每个节点对应的 `Node` 指针。每次读入一组关系序偶对 `(parent, child)` 后,我们可以在 `unordered_map` 中查找 `parent` 对应的 `Node`,然后将 `child` 构建为一个 `Node`,并将其指针添加到 `parent` 的孩子节点数组中。如果 `parent` 在 `unordered_map` 中不存在,说明该节点还没有被构建,需要先构建一个 `Node` 并将其添加到 `unordered_map` 中。最后,我们可以通过递归实现先根遍历该树,具体实现如下:
```cpp
void preorder(Node* root) {
if (!root) {
return;
}
cout << root->val << " "; // 访问当前节点
for (Node* child : root->ch) { // 遍历孩子节点
preorder(child); // 递归遍历孩子节点的子树
}
}
```
完整代码如下所示:
```cpp
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
struct Node {
char val; // 节点的值
vector<Node*> ch; // 孩子节点指针数组
Node(char v) : val(v) {}
};
int main() {
unordered_map<char, Node*> mp; // 保存每个节点对应的Node指针
char parent, child;
while (cin >> parent >> child) {
if (!mp.count(parent)) { // 如果父节点不存在,则需要先构建父节点
mp[parent] = new Node(parent);
}
Node* p = mp[parent];
Node* c = new Node(child); // 构建孩子节点
p->ch.push_back(c); // 将孩子节点添加到父节点的孩子节点数组中
mp[child] = c; // 将孩子节点加入到unordered_map中
}
preorder(mp['A']); // 从根节点'A'开始先根遍历该树
return 0;
}
```
注意,在实际使用中,需要根据输入的数据判断根节点是哪个,然后以该节点为根节点进行遍历。上述代码中的根节点假设为字母 'A'。
阅读全文