基于二叉排序树的查找

1、问题定义

        基于二叉排序树的查找

2、问题分析

        从team.txt中读取参赛队伍的基本信息,实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时的平均查找长度ASL;否则,输出“查找失败!”。

        team.txt中参赛信息的对应数据示例如下:

3、概要设计

        以下是基于二叉排序树的参赛队伍基本信息管理与查找的C++代码示例:

        

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

// 参赛队伍结构体定义
struct Team {
    int num;            // 参赛队编号
    string name;        // 参赛作品名称
    string school;      // 参赛学校
    string category;    // 赛事类别
    string participants;    // 参赛者
    string teacher;     // 指导老师
};

// 二叉排序树结构体定义
struct BSTNode {
    Team data;
    BSTNode* lchild;
    BSTNode* rchild;
};

// 插入节点到二叉排序树中
void InsertBST(BSTNode*& root, Team x) {
    if (!root) {
        root = new BSTNode{ x, nullptr, nullptr };
        return;
    }
    if (x.num < root->data.num) {
        InsertBST(root->lchild, x);
    }
    else {
        InsertBST(root->rchild, x);
    }
}

// 查找节点在二叉排序树中的层数
int SearchBST(BSTNode* root, int target, int level) {
    if (!root) {
        return -1;
    }
    if (target == root->data.num) {
        cout << "赛事类别:" << root->data.category << endl;
        return level;
    }
    else if (target < root->data.num) {
        return SearchBST(root->lchild, target, level + 1);
    }
    else {
        return SearchBST(root->rchild, target, level + 1);
    }
}

// 获取参赛队信息并插入到二叉排序树中
void ReadTeamInfo(BSTNode*& root) {
    ifstream fin("team.txt");
    if (!fin.is_open()) {
        cout << "文件打开失败!" << endl;
        return;
    }
    Team t;
    while (fin >> t.num >> t.name >> t.school >> t.category >> t.participants >> t.teacher) {
        InsertBST(root, t);
    }
    fin.close();
}

int main() {
    BSTNode* root = nullptr;
    ReadTeamInfo(root);     // 读取并插入参赛队信息到二叉排序树中
    
    int num;
    cout << "请输入要查找的参赛队编号:";
    cin >> num;
    
    int asl = SearchBST(root, num, 1);
    if (asl == -1) {
        cout << "查找失败!" << endl;
    }
    else {
        cout << "平均查找长度ASL:" << asl << endl;
    }
    
    return 0;
}

        选用二叉排序树作为数据结构来实现队伍的查找操作。二叉排序树具有以下特点:
        每个节点的左子树的所有节点值都小于该节点的值,而右子树的所有节点值都大于该节点的值,符合队伍编号的大小关系。
        可以通过比较节点值来进行快速查找,减少查找时间复杂度。
        二叉排序树的平均查找长度(ASL)较小,适合用于查找操作。
        通过使用二叉排序树,我们可以高效地实现参赛队伍的查找操作。二叉排序树的特性使得查找过程具有较低的时间复杂度,并且可以根据查找的结果输出相应的信息。平均查找长度(ASL)是衡量查找效率的指标之一,通过计算ASL可以评估二叉排序树的性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值