1. 程式人生 > 其它 >7-5 堆中的路徑 (25分)

7-5 堆中的路徑 (25分)

技術標籤:資料結構與演算法題目集(中文)資料結構c語言堆疊

7-5 堆中的路徑 (25分)

將一系列給定數字插入一個初始為空的小頂堆H[]。隨後對任意給定的下標i,列印從H[i]到根結點的路徑。

輸入格式:

每組測試第1行包含2個正整數NM(≤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; }