浙江大学 数据结构—堆的操作
来源:互联网 发布:检测普通话的软件 编辑:程序博客网 时间:2024/05/10 20:33
题目:
05-树7 堆中的路径 (25分)
将一系列给定数字插入一个初始为空的小顶堆H[]
。随后对任意给定的下标i
,打印从H[i]
到根结点的路径。
输入格式:
每组测试第1行包含2个正整数NNN和MMM(≤1000\le 1000≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的NNN个要被插入一个初始为空的小顶堆的整数。最后一行给出MMM个下标。
输出格式:
对输入中给出的每个下标i
,在一行中输出从H[i]
到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。
输入样例:
5 346 23 26 24 105 4 3
输出样例:
24 23 1046 23 1026 10
堆是这样一种树形数据结构,以小根堆为例,满足节点的左右儿子的值均小于该节点的权值,且左右子树均为堆。
建立一个小根堆的方法很简单,根据线性结构存储一棵树的方法,每个节点i的根节点即为i/2,每次加入一个节点,只需将其插入在最后,并按顺序上调即可。
具体实现见代码
代码:
//By Sean Chen#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int a[200005];int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) //建立小根堆 { scanf("%d",&a[i]); int t=i; while(t!=1) { if(a[t/2]>a[t]) swap(a[t/2],a[t]); //向上调整 t/=2; } } for(int i=0;i<m;i++) { int t; scanf("%d",&t); int flag=1; while(t) //向上寻找到根节点的路径 { if(flag) flag=0; else printf(" "); printf("%d",a[t]); t/=2; } cout<<endl; } return 0;}
0 0
- 浙江大学 数据结构—堆的操作
- 【数据结构基础】最大堆的基本操作
- 数据结构-5 堆的定义与操作
- 【数据结构】堆的创建以及其他操作!!!
- 数据结构 — 堆基本概念以及基本操作
- 数据结构——树(2)——二叉堆的基本操作原理
- 数据结构 串的堆分配及基本操作
- 【数据结构】堆串的连接,替换,插入操作
- 数据结构――堆的基本概念及其操作
- 算法与数据结构-堆的基本操作C语言实现
- 算法与数据结构-堆的基本操作C语言实现
- 基本数据结构――堆的基本概念及其操作
- 数据结构—堆的学习:堆化数组、堆的插入、堆的删除
- 数据结构(Java)——堆的应用
- PTA数据结构——堆的路径
- 数据结构——堆的实现
- 【数据结构】堆的应用
- 数据结构堆的实现
- JS中=>,===与==类型转换
- linux---排序命令 sort,wc,uniq
- 网络协议
- Servlet Cookie 处理
- oracle 误删 dbf 恢复
- 浙江大学 数据结构—堆的操作
- 面试题总结6
- com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileExcep
- linux中Cron定时任务系统命令详解
- Spring中定时器实现
- html标签属性
- IOS 字典数组简写,以及字典中没有此key的取值
- 在Springboot下使用Jedis操作redis---jedis在代码中的使用
- Ubuntu GCC 5.4.0 降级GCC 5.3.0