一、问题重述:
能够提供按参赛学校查询参赛团队(或根据赛事类别查询参赛团队),即,根据提示输入参赛学校名称(赛事类别),若查找成功,输出该学校参赛的(该赛事类别的)所有团队的基本信息,输出的参赛团队按赛事类别有序输出。(排序算法可从选择排序、插入排序、希尔排序、归并排序、堆排序中任意选择,并为选择算法的原因做出说明。)
二、问题分析:
首先构建一个二叉排序树(BST),用于存储和查找参赛队伍的信息。
- 构建二叉排序树:
struct BSTNode { Team team; BSTNode* left; BSTNode* right; }; void insertNode(BSTNode*& root, const Team& team) { if (root == nullptr) { root = new BSTNode{ team, nullptr, nullptr }; } else { if (team.teamNumber < root->team.teamNumber) { insertNode(root->left, team); } else { insertNode(root->right, team); } } } BSTNode* buildBST(const vector<Team>& teams) { BSTNode* root = nullptr; for (const auto& team : teams) { insertNode(root, team); } return root; }
再定义二叉排序树的节点结构
BSTNode
,包含一个Team
对象和两个指针,指向左子树和右子树。insertNode
函数用于向二叉排序树中插入节点,保持树的有序性。buildBST
函数通过遍历队伍列表,并调用insertNode
来构建整个二叉排序树。最后,返回树的根节点。 - 在二叉排序树中查找参赛队伍:
BSTNode* searchTeam(BSTNode* root, int teamNumber, int& count) { if (root == nullptr || root->team.teamNumber == teamNumber) { return root; } if (teamNumber < root->team.teamNumber) { count++; return searchTeam(root->left, teamNumber, count); } else { count++; return searchTeam(root->right, teamNumber, count); } }
这段代码实现了在二叉排序树中查找指定参赛队伍的函数。从根节点开始,根据给定的teamNumber
值与当前节点的值进行比较。如果相等,则返回当前节点;如果小于当前节点的值,则在左子树中继续查找;如果大于当前节点的值,则在右子树中继续查找。同时,count
参数用于记录查找过程中的平均查找长度(ASL)。
3.输出查找结果
void printSearchResult(BSTNode* result, int count) {
if (result != nullptr) {
// 输出参赛队伍的基本信息
cout << "参赛作品名称: " << result->team.projectName << endl;
cout << "参赛学校: " << result->team.school << endl;
cout << "赛事类别: " << result->team.eventCategory << endl;
cout << "参赛者: " << result->team.participants << endl;
cout << "指导老师: " << result->team.teacher << endl;
cout << "平均查找长度ASL: " << static_cast<double>(count) << endl;
}
else {
cout << "查找失败!" << endl;