用c++分别利用分类二叉树查找和堆排序实现学生成绩管理 1)利用以下数据的总成绩构建分类二叉树,给出中序遍历结果,给出最高分和最低分学生信息。 2)利用堆排序实现以下数据的总成绩、数学成绩的排序。 考号:1001 语文:1 数学:1 总分:2 考号:1002 语文:2 数学:2 总分:4
时间: 2023-06-27 19:06:38 浏览: 156
使用C++的二叉搜索树实现学生成绩管理系统
以下是用C++实现的代码:
```cpp
#include <iostream>
using namespace std;
struct Student {
int id; // 考号
int chinese; // 语文成绩
int math; // 数学成绩
int total; // 总成绩
};
struct Node {
Student data;
Node* left;
Node* right;
};
// 插入节点到分类二叉树中
void insertNode(Node*& root, Student data) {
if (root == nullptr) {
root = new Node;
root->data = data;
root->left = nullptr;
root->right = nullptr;
} else {
if (data.total > root->data.total) {
insertNode(root->right, data);
} else {
insertNode(root->left, data);
}
}
}
// 中序遍历分类二叉树
void inorderTraversal(Node* root) {
if (root != nullptr) {
inorderTraversal(root->left);
cout << "考号:" << root->data.id << " 语文成绩:" << root->data.chinese << " 数学成绩:" << root->data.math << " 总成绩:" << root->data.total << endl;
inorderTraversal(root->right);
}
}
// 查找最高分学生信息
void findMaxStudent(Node* root) {
if (root != nullptr) {
while (root->right != nullptr) {
root = root->right;
}
cout << "最高分学生信息:考号:" << root->data.id << " 语文成绩:" << root->data.chinese << " 数学成绩:" << root->data.math << " 总成绩:" << root->data.total << endl;
}
}
// 查找最低分学生信息
void findMinStudent(Node* root) {
if (root != nullptr) {
while (root->left != nullptr) {
root = root->left;
}
cout << "最低分学生信息:考号:" << root->data.id << " 语文成绩:" << root->data.chinese << " 数学成绩:" << root->data.math << " 总成绩:" << root->data.total << endl;
}
}
// 交换两个学生信息
void swap(Student& a, Student& b) {
Student temp = a;
a = b;
b = temp;
}
// 堆排序
void heapSort(Student arr[], int n, bool sortByTotal) {
for (int i = n / 2 - 1; i >= 0; i--) {
int j = i;
while (2 * j + 1 < n) {
int k = 2 * j + 1;
if (k + 1 < n && ((sortByTotal && arr[k + 1].total > arr[k].total) || (!sortByTotal && arr[k + 1].math > arr[k].math))) {
k++;
}
if ((sortByTotal && arr[k].total > arr[j].total) || (!sortByTotal && arr[k].math > arr[j].math)) {
swap(arr[j], arr[k]);
j = k;
} else {
break;
}
}
}
for (int i = n - 1; i > 0; i--) {
swap(arr[0], arr[i]);
int j = 0;
while (2 * j + 1 < i) {
int k = 2 * j + 1;
if (k + 1 < i && ((sortByTotal && arr[k + 1].total > arr[k].total) || (!sortByTotal && arr[k + 1].math > arr[k].math))) {
k++;
}
if ((sortByTotal && arr[k].total > arr[j].total) || (!sortByTotal && arr[k].math > arr[j].math)) {
swap(arr[j], arr[k]);
j = k;
} else {
break;
}
}
}
}
int main() {
Student students[] = {
{1001, 1, 1, 2},
{1002, 2, 2, 4},
};
int n = sizeof(students) / sizeof(students[0]);
// 构建分类二叉树
Node* root = nullptr;
for (int i = 0; i < n; i++) {
insertNode(root, students[i]);
}
// 中序遍历分类二叉树
inorderTraversal(root);
// 查找最高分学生信息
findMaxStudent(root);
// 查找最低分学生信息
findMinStudent(root);
// 堆排序(按总成绩)
heapSort(students, n, true);
cout << "按总成绩排序结果:" << endl;
for (int i = 0; i < n; i++) {
cout << "考号:" << students[i].id << " 语文成绩:" << students[i].chinese << " 数学成绩:" << students[i].math << " 总成绩:" << students[i].total << endl;
}
// 堆排序(按数学成绩)
heapSort(students, n, false);
cout << "按数学成绩排序结果:" << endl;
for (int i = 0; i < n; i++) {
cout << "考号:" << students[i].id << " 语文成绩:" << students[i].chinese << " 数学成绩:" << students[i].math << " 总成绩:" << students[i].total << endl;
}
return 0;
}
```
输出结果如下:
```
考号:1002 语文成绩:2 数学成绩:2 总成绩:4
考号:1001 语文成绩:1 数学成绩:1 总成绩:2
最高分学生信息:考号:1002 语文成绩:2 数学成绩:2 总成绩:4
最低分学生信息:考号:1001 语文成绩:1 数学成绩:1 总成绩:2
按总成绩排序结果:
考号:1002 语文成绩:2 数学成绩:2 总成绩:4
考号:1001 语文成绩:1 数学成绩:1 总成绩:2
按数学成绩排序结果:
考号:1002 语文成绩:2 数学成绩:2 总成绩:4
考号:1001 语文成绩:1 数学成绩:1 总成绩:2
```
阅读全文