参赛队伍管理系统(2)

文章描述了一种基于二叉排序树的数据结构来存储和查找参赛队伍信息的方法。通过读取team.txt文件获取数据,构建二叉排序树,并提供了查找、插入和计算平均查找长度(ASL)的函数。查找成功时,输出队伍详细信息及ASL;失败则输出查找失败信息。
摘要由CSDN通过智能技术生成

实验目标

(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;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值