c++写以下要求的代码:1.1 定义Team结构体,包含参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者、指导老师等属性。 1.2 定义BSTNode结构体,表示二叉排序树结点,包括一个Team类型的数据和左右子结点。 1.3 定义BST类,实现二叉排序树相关的操作,包括插入结点、删除结点、查找结点等。 1.4 实现文件读写操作,将参赛队基本信息保存到team.txt文件中,并从文件中读取信息来初始化二叉排序树。
时间: 2023-07-16 12:17:05 浏览: 128
以下是符合要求的代码:
```cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
// 定义Team结构体
struct Team {
int id; // 参赛队编号
string name; // 参赛作品名称
string school; // 参赛学校
string category; // 赛事类别
string players; // 参赛者
string teacher; // 指导老师
// 构造函数
Team(int i, string n, string s, string c, string p, string t) {
id = i;
name = n;
school = s;
category = c;
players = p;
teacher = t;
}
};
// 定义BSTNode结构体
struct BSTNode {
Team data; // Team类型的数据
BSTNode* left; // 左子结点
BSTNode* right; // 右子结点
// 构造函数
BSTNode(Team d) {
data = d;
left = nullptr;
right = nullptr;
}
};
// 定义BST类
class BST {
public:
// 构造函数
BST() {
root = nullptr;
}
// 插入结点
void insertNode(Team data) {
BSTNode* newNode = new BSTNode(data);
if (root == nullptr) { // 如果根结点为空,直接插入
root = newNode;
} else {
BSTNode* currNode = root;
while (true) {
if (data.id < currNode->data.id) { // 插入到左子树
if (currNode->left == nullptr) {
currNode->left = newNode;
break;
} else {
currNode = currNode->left;
}
} else { // 插入到右子树
if (currNode->right == nullptr) {
currNode->right = newNode;
break;
} else {
currNode = currNode->right;
}
}
}
}
}
// 删除结点
void deleteNode(int id) {
root = deleteNodeHelper(root, id);
}
// 查找结点
BSTNode* searchNode(int id) {
return searchNodeHelper(root, id);
}
// 输出二叉排序树中的所有结点
void printBST() {
printBSTHelper(root);
}
// 从文件中读取信息来初始化二叉排序树
void readFromFile(string filename) {
ifstream infile(filename);
int id;
string name, school, category, players, teacher;
while (infile >> id >> name >> school >> category >> players >> teacher) {
Team team(id, name, school, category, players, teacher);
insertNode(team);
}
infile.close();
}
// 将参赛队基本信息保存到team.txt文件中
void writeToFile(string filename) {
ofstream outfile(filename);
writeToFileHelper(root, outfile);
outfile.close();
}
private:
BSTNode* root; // 根结点
// 删除结点的辅助函数
BSTNode* deleteNodeHelper(BSTNode* node, int id) {
if (node == nullptr) {
return nullptr;
} else if (id < node->data.id) { // 在左子树中删除
node->left = deleteNodeHelper(node->left, id);
} else if (id > node->data.id) { // 在右子树中删除
node->right = deleteNodeHelper(node->right, id);
} else { // 找到目标结点
if (node->left == nullptr && node->right == nullptr) { // 没有子结点
delete node;
node = nullptr;
} else if (node->left == nullptr) { // 只有右子结点
BSTNode* temp = node;
node = node->right;
delete temp;
} else if (node->right == nullptr) { // 只有左子结点
BSTNode* temp = node;
node = node->left;
delete temp;
} else { // 左右子结点都存在
BSTNode* minNode = findMinNode(node->right); // 找到右子树中最小的结点
node->data = minNode->data; // 用该结点的数据替换目标结点的数据
node->right = deleteNodeHelper(node->right, minNode->data.id); // 在右子树中删除该结点
}
}
return node;
}
// 查找结点的辅助函数
BSTNode* searchNodeHelper(BSTNode* node, int id) {
if (node == nullptr) {
return nullptr;
} else if (id == node->data.id) {
return node;
} else if (id < node->data.id) {
return searchNodeHelper(node->left, id);
} else {
return searchNodeHelper(node->right, id);
}
}
// 输出二叉排序树中的所有结点的辅助函数
void printBSTHelper(BSTNode* node) {
if (node == nullptr) {
return;
}
printBSTHelper(node->left);
cout << "ID: " << node->data.id << endl;
cout << "Name: " << node->data.name << endl;
cout << "School: " << node->data.school << endl;
cout << "Category: " << node->data.category << endl;
cout << "Players: " << node->data.players << endl;
cout << "Teacher: " << node->data.teacher << endl;
cout << endl;
printBSTHelper(node->right);
}
// 在右子树中找到最小的结点的辅助函数
BSTNode* findMinNode(BSTNode* node) {
while (node->left != nullptr) {
node = node->left;
}
return node;
}
// 将参赛队基本信息保存到文件的辅助函数
void writeToFileHelper(BSTNode* node, ofstream& outfile) {
if (node == nullptr) {
return;
}
writeToFileHelper(node->left, outfile);
outfile << node->data.id << " " << node->data.name << " " << node->data.school << " " << node->data.category << " " << node->data.players << " " << node->data.teacher << endl;
writeToFileHelper(node->right, outfile);
}
};
int main() {
BST bst;
bst.readFromFile("team.txt");
bst.printBST();
// 测试插入结点
Team team1(1, "作品1", "学校1", "类别1", "参赛者1", "指导老师1");
bst.insertNode(team1);
cout << "After inserting team1:" << endl;
bst.printBST();
// 测试删除结点
bst.deleteNode(3);
cout << "After deleting team3:" << endl;
bst.printBST();
// 测试查找结点
BSTNode* searchResult = bst.searchNode(2);
if (searchResult != nullptr) {
cout << "Team2 is found:" << endl;
cout << "ID: " << searchResult->data.id << endl;
cout << "Name: " << searchResult->data.name << endl;
cout << "School: " << searchResult->data.school << endl;
cout << "Category: " << searchResult->data.category << endl;
cout << "Players: " << searchResult->data.players << endl;
cout << "Teacher: " << searchResult->data.teacher << endl;
} else {
cout << "Team2 is not found." << endl;
}
// 将参赛队基本信息保存到文件
bst.writeToFile("team_new.txt");
return 0;
}
```
其中,team.txt 文件的格式为:
```
1 作品1 学校1 类别1 参赛者1 指导老师1
2 作品2 学校2 类别2 参赛者2 指导老师2
3 作品3 学校3 类别3 参赛者3 指导老师3
4 作品4 学校4 类别4 参赛者4 指导老师4
5 作品5 学校5 类别5 参赛者5 指导老师5
```
阅读全文