题意理解:
将一系列给定数字插入一个初始化为空的最小堆H[]。然后对任意给定的小标i,打印从H[i]到根结点的路径。
输入示例:
5 3 (五个结点,比较三次)
46 23 26 24 10
5 4 3
输出示例:
24 23 10
46 23 10
26 10
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1001
#define MINH -10001
int H[MAXN], size;
void Creat()
{
size = 0;
H[0] = MINH; //岗哨
}
void Insert (int x)
{
int i;
if(size>=MAXN)
printf("heap is full\n");
else
{
for(i=++size; H[i/2]>=x; i/=2)
{
H[i] = H[i/2];
}
H[i]=x;
}
}
int main()
{
int n, m, x, i, j;
scanf("%d",&n);
scanf("%d",&m);
Creat();
for(i=0; i<n; i++)
{
scanf("%d", &x);
Insert(x);
}
for(i=0; i<m; i++)
{
scanf("%d", &j);
printf("%d ", H[j]);
while(j>1)
{
j/=2;
printf("%d ",H[j]);
}
printf("\n");
}
return 0;
}