将一系列给定数字插入一个初始为空的小顶堆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
我的答案:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 5 #define MinData -10001 6 typedef struct HeapStruct *MinHeap; 7 struct HeapStruct { 8 int *Data; 9 int Size; 10 int Capacity; 11 }; 12 13 MinHeap Create(int MaxSize) 14 { 15 MinHeap H = malloc(sizeof(struct HeapStruct)); 16 H->Data = malloc((MaxSize+1)*sizeof(int)); 17 H->Size = 0; 18 H->Capacity = MaxSize; 19 H->Data[0] = MinData; 20 21 return H; 22 } 23 24 int IsFull(MinHeap H) 25 { 26 return (H->Size == H->Capacity); 27 } 28 29 void Insert(MinHeap H, int item) 30 { 31 int i; 32 if(IsFull(H)) { 33 printf("Heap Full!"); 34 return; 35 } 36 i = ++H->Size; 37 for(;H->Data[i/2]>item;i/=2) { 38 H->Data[i] = H->Data[i/2]; 39 // printf("i=%d H->Data[%d]=%d ", i, i, H->Data[i]); 40 } 41 H->Data[i] = item; 42 } 43 44 void Print(MinHeap H, int M) 45 { 46 int i, j; 47 int first_flag = 0; 48 49 for(i=0;i<M;i++) { 50 first_flag = 0; 51 scanf("%d", &j); 52 for(;j>0;j/=2) { 53 if(first_flag==0) { 54 printf("%d", H->Data[j]); 55 first_flag++; 56 } else { 57 printf(" %d", H->Data[j]); 58 } 59 } 60 printf(" "); 61 } 62 } 63 64 int main() 65 { 66 int N, M, i; 67 int data; 68 MinHeap mHeap; 69 70 scanf("%d %d ", &N, &M); 71 mHeap = Create(N); 72 for(i=0;i<N;i++) { 73 scanf("%d", &data); 74 Insert(mHeap, data); 75 } 76 // for(i=1;i<=N;i++) { 77 // printf("%d ", mHeap->Data[i]); 78 // } 79 // printf(" "); 80 Print(mHeap, M); 81 }