二叉树排序之从记事本中依次读取每一行通讯录内容,1.将读取的所有教师信息按照年龄构建成二叉排序树,然后,2.分别通过对二叉排序树的先序遍历显示所有教师信息,3.通过二叉排序树的后序遍历按照姓名查询某位教师通讯信息,通过二叉排序树后序遍历按照部门查询该部门所有教师的通讯信息;最后,3.通过二叉排序树的中序遍历输出青年教师(≤35岁)通讯信息,遍历过程中,如果某个结点的年龄大于35岁,那么不再需要遍历该结点的右子树后利用switch循环1 2 3 4 功能项
时间: 2023-11-19 10:04:19 浏览: 84
二叉树排序(二叉数存储结构,中序遍历得到排序结果)
4星 · 用户满意度95%
好的,这是一个比较完整的二叉排序树的应用案例。我来帮你分步解决:
1. 将读取的所有教师信息按照年龄构建成二叉排序树
首先,我们需要定义二叉排序树的结构体和节点结构体:
```c++
struct Teacher {
string name; // 姓名
int age; // 年龄
string department; // 部门
string phone; // 电话
};
struct TreeNode {
Teacher data;
TreeNode* left;
TreeNode* right;
};
```
然后,我们可以按照年龄构建二叉排序树。具体思路是:每读取一行通讯录内容,就创建一个新的节点,并将该节点插入到二叉排序树中。插入节点的时候,需要按照节点的年龄大小进行比较,如果该节点的年龄比当前节点小,则将该节点插入到当前节点的左子树中;否则,将该节点插入到当前节点的右子树中。
这个过程可以用如下代码实现:
```c++
TreeNode* insert(TreeNode* root, Teacher teacher) {
if (root == nullptr) {
root = new TreeNode{teacher, nullptr, nullptr};
} else if (teacher.age < root->data.age) {
root->left = insert(root->left, teacher);
} else {
root->right = insert(root->right, teacher);
}
return root;
}
// 读取文件中的通讯录内容,构建二叉排序树
TreeNode* buildTreeFromFile(string filename) {
ifstream fin(filename);
if (!fin) {
cout << "文件打开失败!" << endl;
return nullptr;
}
TreeNode* root = nullptr;
Teacher teacher;
while (fin >> teacher.name >> teacher.age >> teacher.department >> teacher.phone) {
root = insert(root, teacher);
}
fin.close();
return root;
}
```
2. 分别通过对二叉排序树的先序遍历显示所有教师信息
先序遍历二叉排序树可以按照如下代码实现:
```c++
void preOrder(TreeNode* root) {
if (root != nullptr) {
cout << root->data.name << " " << root->data.age << " " << root->data.department << " " << root->data.phone << endl;
preOrder(root->left);
preOrder(root->right);
}
}
// 先序遍历二叉排序树,显示所有教师信息
void listAllTeachers(TreeNode* root) {
preOrder(root);
}
```
3. 通过二叉排序树的后序遍历按照姓名查询某位教师通讯信息
后序遍历二叉排序树可以按照如下代码实现:
```c++
void postOrder(TreeNode* root, string name) {
if (root != nullptr) {
postOrder(root->left, name);
postOrder(root->right, name);
if (root->data.name == name) {
cout << root->data.name << " " << root->data.age << " " << root->data.department << " " << root->data.phone << endl;
}
}
}
// 通过二叉排序树的后序遍历按照姓名查询某位教师通讯信息
void findTeacherByName(TreeNode* root) {
string name;
cout << "请输入要查询的教师姓名:";
cin >> name;
postOrder(root, name);
}
```
4. 通过二叉排序树后序遍历按照部门查询该部门所有教师的通讯信息
这个问题可以类比上一个问题的解决方法,只需要在遍历的过程中判断节点的部门是否为要查询的部门即可。具体代码如下:
```c++
void postOrder(TreeNode* root, string department) {
if (root != nullptr) {
postOrder(root->left, department);
postOrder(root->right, department);
if (root->data.department == department) {
cout << root->data.name << " " << root->data.age << " " << root->data.department << " " << root->data.phone << endl;
}
}
}
// 通过二叉排序树后序遍历按照部门查询该部门所有教师的通讯信息
void findTeachersByDepartment(TreeNode* root) {
string department;
cout << "请输入要查询的部门:";
cin >> department;
postOrder(root, department);
}
```
5. 通过二叉排序树的中序遍历输出青年教师(≤35岁)通讯信息,遍历过程中,如果某个结点的年龄大于35岁,那么不再需要遍历该结点的右子树后利用switch循环1 2 3 4 功能项
中序遍历二叉排序树可以按照如下代码实现:
```c++
void inOrder(TreeNode* root) {
if (root != nullptr) {
inOrder(root->left);
cout << root->data.name << " " << root->data.age << " " << root->data.department << " " << root->data.phone << endl;
inOrder(root->right);
}
}
// 通过二叉排序树的中序遍历输出青年教师(≤35岁)通讯信息,遍历过程中,如果某个结点的年龄大于35岁,那么不再需要遍历该结点的右子树后利用switch循环1 2 3 4 功能项
void findYoungTeachers(TreeNode* root) {
inOrder(root);
}
```
在遍历过程中,如果某个节点的年龄大于35岁,我们可以通过返回值控制是否需要继续遍历右子树。具体代码如下:
```c++
bool inOrder(TreeNode* root) {
bool needTraverseRight = true;
if (root != nullptr) {
needTraverseRight = inOrder(root->left);
if (root->data.age <= 35) {
cout << root->data.name << " " << root->data.age << " " << root->data.department << " " << root->data.phone << endl;
} else {
needTraverseRight = false;
}
if (needTraverseRight) {
needTraverseRight = inOrder(root->right);
}
}
return needTraverseRight;
}
// 通过二叉排序树的中序遍历输出青年教师(≤35岁)通讯信息,遍历过程中,如果某个结点的年龄大于35岁,那么不再需要遍历该结点的右子树后利用switch循环1 2 3 4 功能项
void findYoungTeachers(TreeNode* root) {
inOrder(root);
}
```
至此,这个问题的所有功能已经实现了。你可以将这些函数放在一起,组成一个完整的程序。
阅读全文