浙江大学 数据结构—堆的操作

来源:互联网 发布:检测普通话的软件 编辑:程序博客网 时间:2024/05/10 20:33

题目:

05-树7 堆中的路径   (25分)

将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。

输入格式:

每组测试第1行包含2个正整数NNNMMM(≤1000\le 10001000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-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
原创粉丝点击