实验目标
(2)从team.txt中读取参赛队伍的基本信息,实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时的平均查找长度ASL;否则,输出“查找失败!”。
主要函数:
// 根据参赛队编号查找参赛队伍
int find_team_by_number(vector<Team>& teams, string number) {
for (int i = 0; i < teams.size(); i++) {
if (teams[i].number == number) {
return i;
}
}
return -1;
}
// 插入节点到二叉排序树中
void insert_node(TreeNode*& root, string number, Team team, int depth) {
if (!root) {
root = new TreeNode;
root->number = number;
root->data = team;
root->depth = depth;
root->left = nullptr;
root->right = nullptr;
}
else if (number < root->number) {
insert_node(root->left, number, team, depth + 1); // 左子树深度+1
}
else {
insert_node(root->right, number, team, depth + 1); // 右子树深度+1
}
}
// 构建二叉排序树
TreeNode* build_tree(vector<Team>& teams) {
TreeNode* root = nullptr;
for (Team team : teams) {
insert_node(root, team.number, team, 0);
}
return root;
}
// 从二叉排序树中查找参赛队伍
bool search_node(TreeNode* root, string number, int& depth, Team& team) {
if (!root) {
return false;
}
else if (root->number == number) {
depth = root->depth; // 返回该节点的深度
team = root->data;
return true;
}
else if (number < root->number) {
depth++;
return search_node(root->left, number, depth, team);
}
else {
depth++;
return search_node(root->right, number, depth, team);
}
}
// 计算二叉排序树的平均查找长度ASL
void calc_asl(TreeNode* root, int depth_sum, int& node_count) {
if (root) {
depth_sum += root->depth;
node_count++;
calc_asl(root->left, depth_sum, node_count);
calc_asl(root->right, depth_sum, node_count);
}
}
// 查找参赛队伍,并输出ASL
void find_team_by_number(TreeNode* root, string number) {
Team team;
int depth = 0;
if (search_node(root, number, depth, team)) {
cout << "参赛作品名称:" << team.name << endl;
cout << "参赛学校:" << team.school << endl;
cout << "赛事类别:" << team.event << endl;
cout << "参赛者:" << team.participant << endl;
cout << "指导教师:" << team.advisor << endl;
int depth_sum = 0, node_count = 0;
calc_asl(root, depth_sum, node_count);
double asl = (double)depth_sum / node_count;
cout << "查找成功!ASL=" << asl << endl;
}
else {
cout << "查找失败!" << endl;
}
if (search_node(root, number, depth, team)) {
// 查找成功的代码
}
else {
depth--; // 更新depth变量,因为search_node()函数中查找失败会自动加1。
cout << "查找失败!" << endl;
}
}