将一系列给定数字插入一个初始为空的小顶堆H[]
。随后对任意给定的下标i
,打印从H[i]
到根结点的路径。
输入格式:
每组测试第1行包含2个正整数N和M(≤),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-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>
typedef struct HNode *Heap; /* 堆的类型定义 */
struct HNode {
int *Data; /* 存储元素的数组 */
int Size; /* 堆中当前元素个数 */
int Capacity; /* 堆的最大容量 */
};
typedef Heap MinHeap; /* 最小堆 */
#define MINDATA -10000 /* 该值应根据具体情况定义为大于堆中所有可能元素的值 */
#define true 1
MinHeap CreateHeap( int MaxSize )
{ /* 创建容量为MaxSize的空的最小堆 */
MinHeap H = (MinHeap)malloc(sizeof(struct HNode));
H->Data = (int *)malloc((MaxSize+1)*sizeof(int));
H->Size = 0;
H->Capacity = MaxSize;
H->Data[0] = MINDATA; /* 定义"哨兵"为小于堆中所有可能元素的值*/
return H;
}
int Insert( MinHeap H, int X )
{ /* 将元素X插入最小堆H,其中H->Data[0]已经定义为哨兵 */
int i;
i = ++H->Size; /* i指向插入后堆中的最后一个元素的位置 */
for ( ; H->Data[i/2] > X ; i/=2 )
H->Data[i] = H->Data[i/2]; /* 上滤X */
H->Data[i] = X; /* 将X插入 */
return true;
}
#define ERROR -1 /* 错误标识应根据具体情况定义为堆中不可能出现的元素值 */
int main(){
int N,M,temp,j; //N为堆中元素个数,M为路径个数
MinHeap H;
scanf("%d %d",&N,&M);
H = CreateHeap(N);
for (int i = 0; i < N; ++i)
{
scanf("%d",&temp);
Insert(H,temp);
}
for (int i = 0; i < M; ++i)
{
scanf("%d",&j);
printf("%d", H->Data[j]);
while( j > 1){
j/=2;
printf(" %d", H->Data[j]);
}
printf("\n");
}
return 0;
}
使用课堂上的堆的程序改的,后来看了讲解发现直接用数组实现就可以了。。尴尬