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可以评估二叉排序树的性能。