7-5 堆中的路徑 (25分)
阿新 • • 發佈:2021-01-29
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
程式碼實現(C語言)
#include<stdio.h>
#define MaxSize 1000
int main()
{
int heap[MaxSize]={-10000}; /* 陣列初始化 */
int n_data, n_test, temp, last=1; /* last為堆size */
scanf("%d %d", &n_data, &n_test); /* 讀入第一行堆的元素數已經測試組數 */
for(int i = 0; i < n_data; i++)
{
scanf("%d", &temp);
/* 插入法建堆 */
if(last == 1)
{
heap[last] = temp;
}
else
{
int j;
/* 上濾的核心程式碼 */
for(j=last; heap[j/2]>temp&&j; j/=2)
heap[j] = heap[j/2];
heap[ j] = temp;
}
last++;
}
/* 輸出部分 */
for(int i = 0; i < n_test; i++)
{
scanf("%d", &temp);
printf("%d", heap[temp]);
temp /= 2;
while(temp)
{
printf(" %d", heap[temp]);
temp /= 2;
}
printf("\n");
}
return 0;
}