作者 陈越
单位 浙江大学
将一系列给定数字插入一个初始为空的小顶堆H[]
。随后对任意给定的下标i
,打印从H[i]
到根结点的路径。
输入格式:
每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。
输出格式:
对输入中给出的每个下标i
,在一行中输出从H[i]
到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。
输入样例:
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 MinData -10001;
//之所以是-10001 因为 给出区间[-10000, 10000]内 并且是最小堆
/* 该值应根据具体情况定义为大于堆中所有可能元素的值 */
typedef struct HNode *MinHeap;
struct HNode {
int *data; //存储元素的数组
int size; //堆中当前元素个数
int zuidarong; //堆的最大容量
};
//创建容量为maxsize的空的最小堆
MinHeap CreateHeap(int maxSize)
{
MinHeap h = (MinHeap)malloc(sizeof(struct HNode));
h->data = (int*)malloc((maxSize+1)*sizeof(int));
h->size = 0;
h->zuidarong = maxSize;
h->data[0] = MinData;//定义"哨兵"为小于堆中所有可能元素的值
return h;
}
void Insert(MinHeap h,int x)
{
int i = ++h->size; // 指向数组最后一个
for(;h->data[i/2]>x;i/=2)
h->data[i] = h->data[i/2];
h->data[i] = x;
}
void OutPut(MinHeap h, int t)
{
for (int z= t; z> 0; z/= 2)
{
if(z!= 1)
printf("%d ", h->data[z]);
else //解决空格问题
printf("%d", h->data[z]);
}
}
int main()
{
int a, b;
int x;
MinHeap h;
h = CreateHeap(a);
scanf("%d %d",&a, &b);
/ 最大N和M随机,元素取到正负10000
if (a< 1 || b<1 || b> 1000)
return 0;
for (int i=0; i<a; i++)
{
scanf("%d",&x);
Insert(h,x);
}
for (int i = 0; i < b; i++)
{
scanf("%d", &x);
OutPut(h, x);
printf("\n");
}
return 0;
}