C语言二叉树之首先,从给出的预置数组中依次读取每一行通讯录内容,将读取的所有教师信息按照年龄构建成二叉排序树,然后,分别通过对二叉排序树的先序遍历显示所有教师信息,通过二叉排序树的后序遍历按照姓名查询某位教师通讯信息,通过二叉排序树后序遍历按照部门查询该部门所有教师的通讯信息;最后,通过二叉排序树的中序遍历输出青年教师(≤35岁)通讯信息,遍历过程中,如果某个结点的年龄大于35岁,那么不再需要遍历该结点的右子树。
时间: 2023-10-01 12:06:37 浏览: 45
这是一道比较典型的 C 语言二叉树题目,下面是一种可能的实现方法:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_DEPT_LEN 10
typedef struct _teacher {
char name[MAX_NAME_LEN + 1];
int age;
char dept[MAX_DEPT_LEN + 1];
char phone[12];
} Teacher;
typedef struct _node {
Teacher *data;
struct _node *left;
struct _node *right;
} Node;
void insert(Node **root, Teacher *teacher) {
if (*root == NULL) {
*root = (Node *)malloc(sizeof(Node));
(*root)->data = teacher;
(*root)->left = NULL;
(*root)->right = NULL;
} else {
if (teacher->age < (*root)->data->age) {
insert(&(*root)->left, teacher);
} else {
insert(&(*root)->right, teacher);
}
}
}
void preorder_traversal(Node *root) {
if (root != NULL) {
printf("%s %d %s %s\n", root->data->name, root->data->age, root->data->dept, root->data->phone);
preorder_traversal(root->left);
preorder_traversal(root->right);
}
}
void postorder_traversal(Node *root, char *name, char *dept) {
if (root != NULL) {
if (strcmp(root->data->name, name) == 0) {
printf("%s %d %s %s\n", root->data->name, root->data->age, root->data->dept, root->data->phone);
} else if (strcmp(root->data->dept, dept) == 0) {
printf("%s %d %s %s\n", root->data->name, root->data->age, root->data->dept, root->data->phone);
}
postorder_traversal(root->left, name, dept);
postorder_traversal(root->right, name, dept);
}
}
void inorder_traversal(Node *root) {
if (root != NULL) {
inorder_traversal(root->left);
if (root->data->age <= 35) {
printf("%s %d %s %s\n", root->data->name, root->data->age, root->data->dept, root->data->phone);
inorder_traversal(root->right);
}
}
}
int main() {
Teacher teachers[] = {
{"Alice", 32, "CS", "12345678"},
{"Bob", 25, "EE", "23456789"},
{"Charlie", 42, "ME", "34567890"},
{"David", 28, "CE", "45678901"},
{"Eve", 37, "CS", "56789012"},
{"Frank", 43, "EE", "67890123"},
{"Grace", 31, "ME", "78901234"},
{"Henry", 24, "CE", "89012345"},
{"Iris", 36, "CS", "90123456"},
{"John", 29, "EE", "01234567"}
};
int n = sizeof(teachers) / sizeof(teachers[0]);
Node *root = NULL;
for (int i = 0; i < n; i++) {
Teacher *teacher = &teachers[i];
insert(&root, teacher);
}
printf("Preorder traversal:\n");
preorder_traversal(root);
char *name = "Charlie";
printf("Postorder traversal for name %s:\n", name);
postorder_traversal(root, name, NULL);
char *dept = "CE";
printf("Postorder traversal for dept %s:\n", dept);
postorder_traversal(root, NULL, dept);
printf("Inorder traversal for young teachers:\n");
inorder_traversal(root);
return 0;
}
```
这个程序首先定义了一个 `Teacher` 结构体,表示教师的信息,包括姓名、年龄、部门和电话号码。然后定义了一个 `Node` 结构体,表示二叉树的结点,包括一个指向 `Teacher` 的指针和左右子树的指针。接下来是 `insert` 函数,用于往二叉排序树中插入一个新的结点,它会按照年龄大小比较来决定新结点应该插入到左子树还是右子树。`preorder_traversal` 函数用于执行二叉排序树的先序遍历,它会先输出当前结点的信息,然后递归地遍历左子树和右子树。`postorder_traversal` 函数用于执行二叉排序树的后序遍历,它会先递归地遍历左子树和右子树,然后输出当前结点的信息,但只有当当前结点的姓名或部门与目标相同时才输出。`inorder_traversal` 函数用于执行二叉排序树的中序遍历,它会先递归地遍历左子树,然后输出当前结点的信息(如果年龄小于等于 35),最后递归地遍历右子树。
在 `main` 函数中,我们先定义了一个预置的教师数组,然后通过循环依次插入到二叉排序树中。接下来分别执行了四次遍历并输出结果,最后释放了 `root` 指向的二叉排序树内存。