已知一颗树的节点间关系,请编程实现该树的先根遍历。
时间: 2024-03-17 08:41:24 浏览: 18
可以使用递归的方式实现树的先根遍历,具体步骤如下:
1. 首先访问根节点。
2. 然后依次遍历根节点的每个子节点,对于每个子节点,先根遍历该子节点的所有子节点。
3. 重复步骤2,直到遍历完所有子节点。
下面是使用 Python 实现的代码:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.children = []
def preorderTraversal(root: TreeNode):
if not root:
return
print(root.val)
for child in root.children:
preorderTraversal(child)
```
其中,`TreeNode` 是树节点的类,包含节点的值和子节点列表。`preorderTraversal` 函数是先根遍历的实现,接受根节点作为参数,递归地遍历树,并输出每个节点的值。
相关问题
已知一颗树的节点间关系,请编程实现该树的先根遍历
可以按照以下步骤解决该问题:
1. 构建树的数据结构。可以定义一个 `TreeNode` 结构体,其中包含当前节点的值和子节点的指针数组。
```c++
struct TreeNode {
int val;
vector<TreeNode*> children;
TreeNode(int x) : val(x) {}
};
```
2. 根据输入构建树。我们可以使用一个哈希表来保存每个节点对应的指针,并在构建树的过程中使用该哈希表来查找每个节点的指针。
```c++
map<int, TreeNode*> nodes;
while (cin >> parent >> child) {
// 根据节点值查找节点指针
TreeNode* parentNode = nullptr;
if (nodes.find(parent) != nodes.end()) {
parentNode = nodes[parent];
} else {
parentNode = new TreeNode(parent);
nodes[parent] = parentNode;
}
TreeNode* childNode = nullptr;
if (nodes.find(child) != nodes.end()) {
childNode = nodes[child];
} else {
childNode = new TreeNode(child);
nodes[child] = childNode;
}
// 将子节点添加到父节点的子节点数组中
parentNode->children.push_back(childNode);
}
```
3. 实现先根遍历。可以使用递归方式实现先根遍历,先遍历当前节点,然后递归遍历每个子节点。
```c++
void preorderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
cout << root->val << " ";
for (auto child : root->children) {
preorderTraversal(child);
}
}
```
完整代码如下:
```c++
#include <iostream>
#include <vector>
#include <map>
using namespace std;
struct TreeNode {
int val;
vector<TreeNode*> children;
TreeNode(int x) : val(x) {}
};
void preorderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
cout << root->val << " ";
for (auto child : root->children) {
preorderTraversal(child);
}
}
int main() {
map<int, TreeNode*> nodes;
int parent, child;
while (cin >> parent >> child) {
TreeNode* parentNode = nullptr;
if (nodes.find(parent) != nodes.end()) {
parentNode = nodes[parent];
} else {
parentNode = new TreeNode(parent);
nodes[parent] = parentNode;
}
TreeNode* childNode = nullptr;
if (nodes.find(child) != nodes.end()) {
childNode = nodes[child];
} else {
childNode = new TreeNode(child);
nodes[child] = childNode;
}
parentNode->children.push_back(childNode);
}
preorderTraversal(nodes.begin()->second);
return 0;
}
```
C++已知一颗树的节点间关系,请编程实现该树的先根遍历
以下是C++实现先根遍历的代码,假设节点的定义如下:
```c++
struct TreeNode {
int val;
vector<TreeNode*> children;
TreeNode(int x) : val(x) {}
};
```
先根遍历的实现代码如下:
```c++
void preorderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
cout << root->val << " "; // 访问当前节点
// 递归访问子节点
for (auto child : root->children) {
preorderTraversal(child);
}
}
```
在主函数中,我们可以按照以下方式构建一个树并进行先根遍历:
```c++
int main() {
// 构建一颗树
TreeNode* root = new TreeNode(1);
TreeNode* node2 = new TreeNode(2);
TreeNode* node3 = new TreeNode(3);
root->children.push_back(node2);
root->children.push_back(node3);
TreeNode* node4 = new TreeNode(4);
TreeNode* node5 = new TreeNode(5);
node2->children.push_back(node4);
node2->children.push_back(node5);
TreeNode* node6 = new TreeNode(6);
node3->children.push_back(node6);
// 先根遍历
preorderTraversal(root);
return 0;
}
```
输出结果为:1 2 4 5 3 6