7-5 堆中的路徑 -PTA
阿新 • • 發佈:2018-12-05
將一系列給定數字插入一個初始為空的小頂堆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> #define MaxSize 1005 #define MinData -10001 int H[MaxSize],size; void CreateHeap(); void Insert(int X); int main() { int n,m; int x,index; scanf("%d %d",&n,&m); CreateHeap(); //堆初始化 for(int i=0; i<n; i++){ scanf("%d",&x); Insert(x); //以逐個插入的方式建堆 } for(int i=0; i<m; i++){ scanf("%d",&index); printf("%d",H[index]); while( index>1 ){ //沿根的方向輸出結點 index/=2; printf(" %d",H[index]); } printf("\n"); } return 0; } void CreateHeap() { size = 0; H[0] = MinData; //哨兵結點 } bool IsFull() //判斷最小堆是否滿 { return (size == MaxSize); } void Insert(int X) { int i; if( IsFull() ){ printf("最小堆已滿\n"); return; } for(i=++size; H[i/2]>X; i/=2) H[i] = H[i/2]; H[i] = X; }