二叉树排序之从记事本中依次读取每一行通讯录内容,1.将读取的所有教师信息按照年龄构建成二叉排序树,然后,2.分别通过对二叉排序树的先序遍历显示所有教师信息,3.通过二叉排序树的后序遍历按照姓名查询某位教师通讯信息,通过二叉排序树后序遍历按照部门查询该部门所有教师的通讯信息;最后,.通过二叉排序树的中序遍历输出青年教师(≤35岁)通讯信息,遍历过程中,如果某个结点的年龄大于35岁,那么不再需要遍历该结点的右子树。主程序利用switch循环前4项功能项的源代码
时间: 2023-11-19 20:04:19 浏览: 24
以下是利用 switch 循环前 4 项功能项的源代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_DEPT_LEN 20
#define MAX_PHONE_LEN 20
struct Teacher {
char name[MAX_NAME_LEN];
int age;
char dept[MAX_DEPT_LEN];
char phone[MAX_PHONE_LEN];
struct Teacher *left;
struct Teacher *right;
};
typedef struct Teacher Teacher;
Teacher* create_teacher(char* name, int age, char* dept, char* phone) {
Teacher* teacher = (Teacher*) malloc(sizeof(Teacher));
strncpy(teacher->name, name, MAX_NAME_LEN);
teacher->age = age;
strncpy(teacher->dept, dept, MAX_DEPT_LEN);
strncpy(teacher->phone, phone, MAX_PHONE_LEN);
teacher->left = NULL;
teacher->right = NULL;
return teacher;
}
void insert_teacher(Teacher** root, Teacher* teacher) {
if (*root == NULL) {
*root = teacher;
} else if (teacher->age < (*root)->age) {
insert_teacher(&((*root)->left), teacher);
} else {
insert_teacher(&((*root)->right), teacher);
}
}
void preorder_traversal(Teacher* root) {
if (root == NULL) {
return;
}
printf("%s %d %s %s\n", root->name, root->age, root->dept, root->phone);
preorder_traversal(root->left);
preorder_traversal(root->right);
}
void postorder_traversal_name(Teacher* root, char* name) {
if (root == NULL) {
return;
}
postorder_traversal_name(root->left, name);
postorder_traversal_name(root->right, name);
if (strcmp(root->name, name) == 0) {
printf("%s %d %s %s\n", root->name, root->age, root->dept, root->phone);
}
}
void postorder_traversal_dept(Teacher* root, char* dept) {
if (root == NULL) {
return;
}
postorder_traversal_dept(root->left, dept);
postorder_traversal_dept(root->right, dept);
if (strcmp(root->dept, dept) == 0) {
printf("%s %d %s %s\n", root->name, root->age, root->dept, root->phone);
}
}
void inorder_traversal_young(Teacher* root) {
if (root == NULL) {
return;
}
inorder_traversal_young(root->left);
if (root->age <= 35) {
printf("%s %d %s %s\n", root->name, root->age, root->dept, root->phone);
inorder_traversal_young(root->right);
}
}
int main() {
Teacher* root = NULL;
int choice;
char name[MAX_NAME_LEN];
int age;
char dept[MAX_DEPT_LEN];
char phone[MAX_PHONE_LEN];
while (1) {
printf("1. Insert teacher info\n");
printf("2. Preorder traversal\n");
printf("3. Postorder traversal by name\n");
printf("4. Postorder traversal by dept\n");
printf("5. Inorder traversal for young teachers\n");
printf("6. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter name, age, dept and phone: ");
scanf("%s %d %s %s", name, &age, dept, phone);
insert_teacher(&root, create_teacher(name, age, dept, phone));
break;
case 2:
printf("Teacher info (preorder traversal):\n");
preorder_traversal(root);
break;
case 3:
printf("Enter name: ");
scanf("%s", name);
printf("Teacher info (postorder traversal by name):\n");
postorder_traversal_name(root, name);
break;
case 4:
printf("Enter dept: ");
scanf("%s", dept);
printf("Teacher info (postorder traversal by dept):\n");
postorder_traversal_dept(root, dept);
break;
case 5:
printf("Young teacher info (inorder traversal):\n");
inorder_traversal_young(root);
break;
case 6:
printf("Exiting...\n");
exit(0);
default:
printf("Invalid choice!\n");
}
}
return 0;
}
```