基于二叉排序树的查找(根据队伍编号查找)源代码

import os

#  参赛队伍信息查询
class TreeNode:  # 节点类
    def __init__(self, node=None):
        self.left = None  # 左子节点
        self.right = None  # 右子节点
        self.node = node   # 节点的值,初始化为空值None

def read_txt(all_teams):
    teams = {}
    if os.path.exists(all_teams):  # 判断文件是否存在
        with open(all_teams, 'r' ) as f:
            i = 0
            for line in f:
                if i > 0:
                    data = line.strip().split('#')
                    team = {'team_num': int(data[0].strip()),'work_name': data[1].strip(),'school': data[2].strip(),'category_word': data[3].strip(),
                        'who': data[4].strip(),'teacher': data[5].strip()
                    }
                    teams[team['team_num']] = team
                i += 1
    return teams

def creat_tree(teams):  # 构建二叉树
    root = TreeNode()
    for key in teams:
        node = TreeNode(teams[key])
        if not root.node:
            root.node = node.node
        else:
            now = root
            while True:
                if key < now.node['team_num']:
                    if not now.left:
                        now.left = node
                        break
                    else:
                        now = now.left
                elif key > now.node['team_num']:
                    if not now.right:
                        now.right = node
                        break
                    else:
                        now = now.right
                else:
                    now.node = node.node
    return root

def all_digit(root):  # 遍历所有节点
    all_teams = 'team.txt'
    teams = read_txt(all_teams)
    all_count = 0
    all_num = 0
    team_id = []
    for i in teams.keys():
        team_id.append(i)
    for t_id in team_id:
        team, count = search_tree(root, t_id)
        all_count += count
    all_num += all_count
    return all_num

def search_tree(root, key):  # 查找目标节点,跟根节点比较,等于:返回节点的值,小于:和左子树继续比较,大于:和右子树继续比较
    now = root
    count = 0
    while now:
        count += 1
        if key == now.node['team_num']:
            return now.node, count
        elif key < now.node['team_num']:
            now = now.left
        else:
            now = now.right
    return None, count


def main():
    all_teams = 'team.txt'
    teams = read_txt(all_teams)
    root = creat_tree(teams)
    find_count = 0  # 查找成功
    while True:
        choice = input('请输入要执行的操作序号(1-2):')

        if choice == '1':   # 按编号查找参赛队伍
            key = int(input('请输入要查找的参赛队伍编号:'))
            team, count = search_tree(root, key)
            if team:
                print(team['team_num'], '  #','\t', team['work_name'],'  #','\t',  team['school'], '  #','\t',
                      team['category_word'],'  #', '\t',  team['who'],'  #', '\t',  team['teacher'])
                find_count += 1
            else:
                print('输入的编号有误')
        elif choice == '2':
            print('退出成功')
            break
        else:
            print('输入格式错误')

        if find_count > 0:
            all_num = all_digit(root)
            ASL = all_num / 398
            print(f'平均查找长度ASL:{ASL:.3f}')
if __name__ == "__main__":
    main()

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值