二叉树排序之从记事本中依次读取每一行通讯录内容,1.将读取的所有教师信息按照年龄构建成二叉排序树,。然后,2.分别通过对二叉排序树的先序遍历显示所有教师信息,3.通过二叉排序树的后序遍历按照姓名查询某位教师通讯信息,通过二叉排序树后序遍历按照部门查询该部门所有教师的通讯信息;最后,3.通过二叉排序树的中序遍历输出青年教师(≤35岁)通讯信息,遍历过程中,如果某个结点的年龄大于35岁,那么不再需要遍历该结点的右子树且利用switch循环
时间: 2023-11-17 12:08:12 浏览: 65
好的,这是一个比较完整的二叉排序树的应用,我将会带您一步步实现这个程序。
首先,我们需要定义一个二叉树结构体,包含每个节点的信息:
```c
typedef struct Teacher {
char name[20];
int age;
char department[20];
struct Teacher* left;
struct Teacher* right;
} Teacher;
```
这个结构体包含了教师的姓名、年龄、部门以及左右子节点指针。
接下来,我们需要实现一个插入节点的函数,用于将每个教师信息插入到二叉排序树中:
```c
void insert(Teacher** root, char* name, int age, char* department) {
if (*root == NULL) {
*root = (Teacher*)malloc(sizeof(Teacher));
strcpy((*root)->name, name);
(*root)->age = age;
strcpy((*root)->department, department);
(*root)->left = NULL;
(*root)->right = NULL;
} else {
if (age < (*root)->age) {
insert(&((*root)->left), name, age, department);
} else {
insert(&((*root)->right), name, age, department);
}
}
}
```
这个函数接受一个指向根节点指针的指针,以及要插入的教师信息。如果根节点为空,则新建一个节点并赋值;否则,根据年龄大小比较递归插入左右子树。
接下来,我们需要实现先序遍历函数来显示所有教师信息:
```c
void preOrder(Teacher* root) {
if (root != NULL) {
printf("Name: %s, Age: %d, Department: %s\n", root->name, root->age, root->department);
preOrder(root->left);
preOrder(root->right);
}
}
```
这个函数接受一个根节点指针,使用递归方式先输出根节点的信息,再遍历左右子树。
然后,我们需要实现后序遍历函数来按照姓名查询某位教师通讯信息:
```c
void postOrderByName(Teacher* root, char* name) {
if (root != NULL) {
if (strcmp(root->name, name) == 0) {
printf("Name: %s, Age: %d, Department: %s\n", root->name, root->age, root->department);
}
postOrderByName(root->left, name);
postOrderByName(root->right, name);
}
}
```
这个函数接受一个根节点指针和要查询的姓名,使用递归方式后序遍历,如果节点的姓名等于要查询的姓名,则输出该节点的信息。
接下来,我们需要实现后序遍历函数来按照部门查询该部门所有教师的通讯信息:
```c
void postOrderByDepartment(Teacher* root, char* department) {
if (root != NULL) {
postOrderByDepartment(root->left, department);
postOrderByDepartment(root->right, department);
if (strcmp(root->department, department) == 0) {
printf("Name: %s, Age: %d, Department: %s\n", root->name, root->age, root->department);
}
}
}
```
这个函数接受一个根节点指针和要查询的部门,使用递归方式后序遍历,如果节点的部门等于要查询的部门,则输出该节点的信息。
最后,我们需要实现中序遍历函数来输出年龄小于等于35岁的教师信息:
```c
void inOrderYoung(Teacher* root) {
if (root != NULL) {
inOrderYoung(root->left);
if (root->age <= 35) {
printf("Name: %s, Age: %d, Department: %s\n", root->name, root->age, root->department);
}
if (root->age <= 35) {
inOrderYoung(root->right);
}
}
}
```
这个函数接受一个根节点指针,使用递归方式中序遍历,如果节点的年龄小于等于35岁,则输出该节点的信息。注意,在遍历到年龄大于35岁的节点时,不再需要遍历该节点的右子树。
最后,我们将这些函数整合在一起,完整的程序如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Teacher {
char name[20];
int age;
char department[20];
struct Teacher* left;
struct Teacher* right;
} Teacher;
void insert(Teacher** root, char* name, int age, char* department) {
if (*root == NULL) {
*root = (Teacher*)malloc(sizeof(Teacher));
strcpy((*root)->name, name);
(*root)->age = age;
strcpy((*root)->department, department);
(*root)->left = NULL;
(*root)->right = NULL;
} else {
if (age < (*root)->age) {
insert(&((*root)->left), name, age, department);
} else {
insert(&((*root)->right), name, age, department);
}
}
}
void preOrder(Teacher* root) {
if (root != NULL) {
printf("Name: %s, Age: %d, Department: %s\n", root->name, root->age, root->department);
preOrder(root->left);
preOrder(root->right);
}
}
void postOrderByName(Teacher* root, char* name) {
if (root != NULL) {
postOrderByName(root->left, name);
postOrderByName(root->right, name);
if (strcmp(root->name, name) == 0) {
printf("Name: %s, Age: %d, Department: %s\n", root->name, root->age, root->department);
}
}
}
void postOrderByDepartment(Teacher* root, char* department) {
if (root != NULL) {
postOrderByDepartment(root->left, department);
postOrderByDepartment(root->right, department);
if (strcmp(root->department, department) == 0) {
printf("Name: %s, Age: %d, Department: %s\n", root->name, root->age, root->department);
}
}
}
void inOrderYoung(Teacher* root) {
if (root != NULL) {
inOrderYoung(root->left);
if (root->age <= 35) {
printf("Name: %s, Age: %d, Department: %s\n", root->name, root->age, root->department);
}
if (root->age <= 35) {
inOrderYoung(root->right);
}
}
}
int main() {
Teacher* root = NULL;
char name[20];
int age;
char department[20];
FILE* fp = fopen("contacts.txt", "r");
while (fscanf(fp, "%s %d %s", name, &age, department) != EOF) {
insert(&root, name, age, department);
}
fclose(fp);
printf("All Teachers:\n");
preOrder(root);
printf("\nQuery by Name:\n");
postOrderByName(root, "Jack");
printf("\nQuery by Department:\n");
postOrderByDepartment(root, "Math");
printf("\nYoung Teachers:\n");
inOrderYoung(root);
return 0;
}
```
其中,我们从文件中读取每一行通讯录内容,然后调用 `insert` 函数插入到二叉排序树中。最后,按照题目要求调用不同的遍历函数输出结果。
这个程序可能需要根据具体文件格式稍作修改,但是基本思路是一样的。
阅读全文