从team.txt中读取参赛队伍的基本信息,实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时的平均查找长度ASL;否则,输出“查找失败!”。用c++
时间: 2024-02-19 19:02:46 浏览: 62
好的,这是一个二叉排序树的查找问题,我来给你写一下代码。假设team.txt文件的格式如下:
```
队伍编号 参赛作品名称 参赛学校 赛事类别 参赛者 指导老师
```
首先,我们需要定义一个二叉排序树节点的结构体,包含了参赛队伍的基本信息以及左右子节点的指针。
```cpp
struct TeamNode {
int teamNo; // 队伍编号
string projectName; // 参赛作品名称
string school; // 参赛学校
string category; // 赛事类别
string participants; // 参赛者
string teacher; // 指导老师
TeamNode* left;
TeamNode* right;
};
```
接下来,我们需要实现一个二叉排序树的查找函数,用于查找指定队伍编号的参赛队伍信息。同时,我们需要在查找时记录查找路径的长度,以便计算平均查找长度ASL。
```cpp
TeamNode* searchTeam(TeamNode* root, int teamNo, int& length) {
TeamNode* p = root;
length = 0;
while (p != nullptr && p->teamNo != teamNo) {
length++;
if (p->teamNo > teamNo) {
p = p->left;
} else {
p = p->right;
}
}
return p;
}
```
最后,我们需要读取team.txt文件中的参赛队伍信息,并插入到二叉排序树中。在插入过程中,我们需要计算插入的平均查找长度ASL。
```cpp
int main() {
// 从文件中读取参赛队伍信息,并插入到二叉排序树中
ifstream fin("team.txt");
TeamNode* root = nullptr;
double asl = 0.0;
int count = 0;
while (!fin.eof()) {
TeamNode* node = new TeamNode;
fin >> node->teamNo >> node->projectName >> node->school >> node->category >> node->participants >> node->teacher;
int length = 0;
TeamNode* p = searchTeam(root, node->teamNo, length);
if (p == nullptr) {
// 如果在二叉排序树中未找到相同的队伍编号,则插入该节点
if (root == nullptr) {
root = node;
} else {
TeamNode* q = root;
while (true) {
length++;
if (q->teamNo > node->teamNo) {
if (q->left == nullptr) {
q->left = node;
break;
} else {
q = q->left;
}
} else {
if (q->right == nullptr) {
q->right = node;
break;
} else {
q = q->right;
}
}
}
}
count++;
}
asl += (double)length / count;
}
fin.close();
// 输入要查找的参赛队伍编号
int teamNo;
cout << "请输入要查找的参赛队伍编号:";
cin >> teamNo;
// 在二叉排序树中查找指定队伍编号的参赛队伍信息
int length = 0;
TeamNode* p = searchTeam(root, teamNo, length);
if (p != nullptr) {
// 如果查找成功,则输出该参赛队伍的基本信息以及平均查找长度ASL
cout << "参赛作品名称:" << p->projectName << endl;
cout << "参赛学校:" << p->school << endl;
cout << "赛事类别:" << p->category << endl;
cout << "参赛者:" << p->participants << endl;
cout << "指导老师:" << p->teacher << endl;
cout << "平均查找长度ASL:" << asl << endl;
} else {
// 如果查找失败,则输出提示信息
cout << "查找失败!" << endl;
}
return 0;
}
```
注意,在计算平均查找长度ASL时,我们需要记录当前已插入的节点数量count,以便在每次插入节点时更新ASL的值。
阅读全文