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()
基于二叉排序树的查找(根据队伍编号查找)源代码
最新推荐文章于 2024-05-16 10:30:00 发布