数据结构 ⑦-树III

树的高级课程

红黑树

红黑树的查找、插入和删除的时间复杂度为O(log2N)


AVL树

Adelson-Velskii 和 Landis

AVL树查找的时间复杂度为O(logN)

AVL树不如红黑树效率高,也不如红黑树常用。

《算法与数据结构》课程计任务书 计任务 个应用程序,利用多级菜单实现线性表、栈、队列、二叉树及图五种结构的基本操作及应用。具体内容包括: 1.线性表的基本操作及应用 ①创建 ②插入 ③删除 ④查找 ⑤遍历 ⑥应用 2.栈的基本操作及应用 ①进栈 ②出栈 ③取栈顶元素 ④应用 3.队列的基本操作及应用 ①入列 ②出列 ③取队头元素 ④取队尾元素 ⑤应用 4.二叉树基本操作及应用 ①创建 ②遍历 ③找双亲 ④找兄弟 ⑤找孩子 ⑥应用 5.图的基本操作及应用 ①创建 ②深度优先遍历 ③广度优先遍历 ④找第个邻接 ⑤找下个邻接 ⑥求顶的度 ⑦应用 二、计要求 1)存储结构 ①线性表使用链式存储结构,如单链表。 ②栈使用顺序存储结构,如顺序栈。 ③队列的存储结构不限,链队列或循环队列均可。 ④二叉树使用链式存储结构,如二叉链表。 ⑤图的存储结构不限,邻接矩阵或邻接表均可。 2)应用选题 ①历史记录。浏览器存储用户访问的网页历史,包括保存网页信息,同时形成访问链,支持前进/后退功能。个应用程序,选择合适的数据结构实现以上功能。 ②播放列表。在音乐播放器的播放列表中,用户可以顺序播放列表里的歌曲,也可以向列表中添加歌曲、删除歌曲等。个应用程序,选择合适的数据结构实现以上功能。 ③服务调度。平台用户完成订单支付后,订单服务发送“支付成功通知”,为防止宕机丢失,需持久化存储消息,同时推送消息给库存服务通知扣减库存,推送消息给通知服务发送短信给用户等。各服务接收消息并成功完成后,回送确认消息给发送服务。为提高效率,各服务异步处理、解耦,即相互之间不直接调用,避免方修改影响另方;同时各自异步处理,提高响应速度。个应用程序,选择合适的数据结构完成以上任务。 ④类型检查。在表达式解析中,可构建抽象语法来检查表达式类型。例如,对于表达式x*(y+z),构建棵运算符为内部结,操作数为叶子结的语法,再通过自底向上的方式推导子类型,如int类型的y和float类型的z相加,得到值的类型为float类型。 ⑤社交推送。在社交平台中,用户之间可以相互关注,但用户A关注用户B,用户B不定关注用户A。其中,用户被关注的数量为用户的传播力;用户关注他人的数量为用户的关注数。显然,被高传播力关注的用户将有助于自身传播力的提升。个应用程序,选择合适的数据结构实现向用户推送高传播力用户列表。 注:利用所学数据结构完成以上若干应用选题(模拟),并添加到对应结构的应用模块中。 3)程序要求 ①整合课内上机所完成的各类结构的基础操作,完成若干新添加的结构应用。 ②所有二级菜单中的基础操作可根据应用需求扩展,原则上不少于所列出的操作。 ③程序独立完成,运行正确,无编译错误,无逻辑错误。 ④应用选题为可选任务,原则上任务完成越多,得分越高。 4)课报告要求 报告格式规范,语言流畅,功能实现描述清楚,测试计合理,结论准确。具体内容包括: ①计方案; ②实现过程; ③实现代码; ④测试与结论; ⑤难与收获。 三、计指导(参考) #include<stdio.h> void ShowMainMenu(){ printf("\n"); printf("*********************数据结构*********************\n"); printf("* 1 线性表的基本操作及应用 *\n"); printf("* 2 栈的基本操作及应用 *\n"); printf("* 3 队列的基本操作及应用 *\n"); printf("* 4 二叉树基本操作及应用 *\n"); printf("* 5 图的基本操作及应用 *\n"); printf("* 6 退出 *\n"); printf("***************************************************\n"); } void LinkList(){ int n; do{ printf("\n"); printf("**************线性表的基本操作及应用***************\n"); printf("* 1 创建 *\n"); printf("* 2 插入 *\n"); printf("* 3 删除 *\n"); printf("* 4 查找 *\n"); printf("* 5 遍历 *\n"); printf("* 6 应用 *\n"); printf("* 7 退出 *\n"); printf("***************************************************\n"); printf("请选择:"); scanf("%d",&n); switch(n){ case 1: printf("--------创建表---------");break; case 2: printf("--------插入个元素-------");break; case 3: printf("--------删除个元素-------");break; case 4: printf("--------查找个元素-------");break; case 5: printf("--------输出所有元素---------");break; case 6: printf("--------应用---------");break; case 7: break; default: printf("ERROR!");break; } }while(n!=7); } void Stack(){ int n; do{ printf("\n"); printf("****************栈的基本操作及应用*****************\n"); printf("* 1 进栈 *\n"); printf("* 2 出栈 *\n"); printf("* 3 取栈顶元素 *\n"); printf("* 4 应用 *\n"); printf("* 5 退出 *\n"); printf("***************************************************\n"); printf("请选择:"); scanf("%d",&n); switch(n){ case 1: printf("--------进栈-------");break; case 2: printf("--------出栈-------");break; case 3: printf("--------取栈顶元素-------");break; case 4: printf("--------应用-------");break; case 5:break; default: printf("ERROR!");break; } }while(n!=5); } void Queue(){ int n; do{ printf("\n"); printf("*************队列的基本操作及应用**************\n"); printf("* 1 入列 *\n"); printf("* 2 出列 *\n"); printf("* 3 取队头元素 *\n"); printf("* 4 取队尾元素 *\n"); printf("* 5 应用 *\n"); printf("* 6 退出 *\n"); printf("***********************************************\n"); printf("请选择:"); scanf("%d",&n); switch(n){ case 1: printf("---------入列-------");break; case 2: printf("---------出列-------");break; case 3: printf("---------取队头元素-------");break; case 4: printf("---------取队尾元素-------");break; case 5: printf("---------应用-------");break; case 6:break; default: printf("ERROR!");break; } }while(n!=6); } void BiTree(){ int n; do{ printf("\n"); printf("**************二叉树基本操作及应用***************\n"); printf("* 1 创建 *\n"); printf("* 2 遍历 *\n"); printf("* 3 查找双亲 *\n"); printf("* 4 查找兄弟 *\n"); printf("* 5 查找孩子 *\n"); printf("* 6 应用 *\n"); printf("* 7 退出 *\n"); printf("***************************************************\n"); printf("请选择:"); scanf("%d",&n); switch(n){ case 1: printf("---------创建二叉树--------");break; case 2: printf("---------遍历(先/中/后)-------");break; case 3: printf("---------查找双亲-------");break; case 4: printf("---------查找兄弟(左/右)-------");break; case 5: printf("---------查找孩子(左/右)-------");break; case 6: printf("---------应用-------");break; case 7:break; default: printf("ERROR!");break; } }while(n!=7); } void Graph(){ int n; do{ printf("\n"); printf("****************图的基本操作及应用*****************\n"); printf("* 1 创建 *\n"); printf("* 2 深度优先遍历 *\n"); printf("* 3 广度优先遍历 *\n"); printf("* 4 找第个邻接 *\n"); printf("* 5 找下个邻接 *\n"); printf("* 6 求顶的度 *\n"); printf("* 7 应用 *\n"); printf("* 8 退出 *\n"); printf("***************************************************\n"); printf("请选择:"); scanf("%d",&n); switch(n){ case 1: printf("---------创建图(有向/无向)-------");break; case 2: printf("---------深度优先遍历-------");break; case 3: printf("---------广度优先遍历-------");break; case 4: printf("---------找第个邻接-------");break; case 5: printf("---------找下个邻接-------");break; case 6: printf("---------求顶的度-------");break; case 7: printf("---------应用-------");break; case 8:break; default: printf("ERROR!");break; } }while(n!=8); } int main(){ int n; do{ ShowMainMenu(); printf("请选择:"); scanf("%d",&n); switch(n){ case 1:LinkList();break; case 2:Stack();break; case 3:Queue();break; case 4:BiTree();break; case 5:Graph();break; case 6:break; default:printf("ERROR!");break; } }while(n!=6); return 1; }
最新发布
06-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值