建立二叉树实现:先序遍历,中序遍历,后序遍历的结果. 输入说明:第一行节点数为n,以下行每行三个数,第一个是父亲,后两个依次是左右孩子,0为空。并写出主函数,使用c语言编写
时间: 2024-10-12 10:13:11 浏览: 54
在 C 语言中,我们可以使用结构体表示二叉树的节点,并分别实现先序、中序和后序遍历算法。这里是一个简单的示例,首先定义了一个 `TreeNode` 结构体:
```c
#include <stdio.h>
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 创建一个新的二叉树节点
TreeNode* createNode(int value) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->val = value;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
```
接下来,我们实现三种遍历方式:
### 先序遍历(根-左-右)
```c
void preOrderTraversal(TreeNode* root) {
if (root != NULL) {
printf("%d ", root->val); // 访问当前节点
preOrderTraversal(root->left); // 遍历左子树
preOrderTraversal(root->right); // 遍历右子树
}
}
```
### 中序遍历(左-根-右)
```c
void inOrderTraversal(TreeNode* root) {
if (root != NULL) {
inOrderTraversal(root->left); // 遍历左子树
printf("%d ", root->val); // 访问当前节点
inOrderTraversal(root->right); // 遍历右子树
}
}
```
### 后序遍历(左-右-根)
```c
void postOrderTraversal(TreeNode* root) {
if (root != NULL) {
postOrderTraversal(root->left); // 遍历左子树
postOrderTraversal(root->right); // 遍历右子树
printf("%d ", root->val); // 访问当前节点
}
}
```
现在我们可以写主函数来根据给定的输入创建二叉树并进行遍历:
```c
int main() {
int n, father, left, right;
scanf("%d", &n);
TreeNode* nodes[n]; // 存储所有节点
for (int i = 0; i < n; i++) {
scanf("%d %d %d", &father, &left, &right);
if (father == 0) continue; // 如果父节点为0,跳过空节点
// 创建新节点
nodes[i] = createNode(i);
// 添加子节点
if (left != 0) {
nodes[father]->left = nodes[left - 1];
}
if (right != 0) {
nodes[father]- 1];
}
}
// 打印先序遍历结果
printf("Preorder traversal: ");
preOrderTraversal(nodes[0]);
printf("\n");
// 打印中序遍历结果
printf("Inorder traversal: ");
inOrderTraversal(nodes[0]);
printf("\n");
// 打印后序遍历结果
printf("Postorder traversal: ");
postOrderTraversal(nodes[0]);
printf("\n");
// 清理内存
for (int i = 0; i < n; i++) {
free(nodes[i]);
}
return 0;
}
```
这个程序假设输入的父子关系是连续的从1开始编号,且输入的节点数量不超过 `n`。
阅读全文