7-5 堆中的路径 (25分)
题目详情
将一系列给定数字插入一个初始为空的小顶堆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 MAX 1005 //最大可以取到1000,0号位不存放,至少要 1001 个空间
#define MIN -100000 //题目提到,数据范围为 [-10000, 10000]
int H[MAX]; //全局变量 “堆”数列
void CreateHeap(int N)
{
for(int i=1;i<=N;i++){
scanf("%d",&H[i]); //输入要插入的数据
int cur_p = i ; int p = i/2;
while(H[p] > H[cur_p]) //找到需要更换的位置
{
int tmp = H[p];
H[p] = H[cur_p];
H[cur_p] = tmp;
p/=2; cur_p/=2;
}
}
}
void PrintRoute()
{
int Pos = 0;
scanf("%d",&Pos); // 传入指定下标
printf("%d",H[Pos]);Pos/=2; //将 Pos 位置的数据打印出来
while(Pos>0) {
printf(" %d",H[Pos]);
Pos/=2;
}
printf("\n");
}
int main()
{
int N, M ;
H[0]=MIN; //哨兵 最小元素
scanf("%d %d",&N,&M);
CreateHeap(N);
for(int i=0; i<M ;i++) PrintRoute();
return 0;
}