05-树7 堆中的路径
将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。
输入格式:
每组测试第1行包含2个正整数N和M(≤),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-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 #define Min -10001 4 5 typedef struct HNode *Heap; 6 struct HNode{ 7 int *Data; 8 int Size; 9 int Capacity; 10 }; 11 12 //建立一个空的小顶堆 13 Heap CreateHeap(int N) { 14 Heap H = (Heap)malloc(sizeof(struct HNode)); 15 H->Data = (int*)malloc(sizeof(int)*(N+1)); 16 H->Data[0] = Min; //将哨兵置为比数据取值范围最小还要小的数 17 H->Size = 0; 18 H->Capacity = N; 19 return H; 20 } 21 22 bool IsFull(Heap H){ 23 return (H->Size == H->Capacity); 24 } 25 26 void Insert(Heap H, int data){ 27 if(IsFull(H)) return; 28 int i = ++(H->Size); 29 for( ; H->Data[i/2] > data ; i/=2){ 30 H->Data[i] = H->Data[i/2]; //下滤data 31 } 32 H->Data[i] = data; 33 } 34 35 int main( ){ 36 int N, L, data, index; 37 scanf("%d%d", &N, &L); 38 Heap MinHeap = CreateHeap(N); 39 for(int i=0; i<N; i++){ 40 scanf("%d", &data); 41 Insert(MinHeap, data); 42 } 43 while(L--){ 44 scanf("%d", &index); 45 for(int i=index; i>0; i/=2){ 46 if(i!=index) printf(" "); 47 printf("%d", MinHeap->Data[i]); 48 } 49 printf("\n"); 50 } 51 return 0; 52 }

浙公网安备 33010602011771号