PTA数据结构与算法题目集(中文) 7-5
PTA数据结构与算法题目集(中文) 7-5 堆中的路径
7-5 堆中的路径 (25 分)
将一系列给定数字插入一个初始为空的小顶堆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
题目分析:考查最小堆(优先队列)的实现 需要注意的是 利用插入操作建立最小(大)堆 和 先把数据读入完全二叉树 再调整的方法 可能建成的堆不同 并且他们的时间复杂度也不同(插入操作所需要的时间复杂度为 o(nlogn) 第二种方法的时间复杂度为 线性时间)
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<malloc.h> 5 6 typedef struct HeapStruct* MinHeap; 7 struct HeapStruct 8 { 9 int Size; 10 int Capacity; 11 int* Elements; 12 }; 13 14 MinHeap CreatMinHeap(int Capacity) 15 { 16 MinHeap H; 17 H = (MinHeap)malloc(sizeof(struct HeapStruct)); 18 H->Capacity = Capacity; 19 H->Elements = (int*)malloc(H->Capacity * sizeof(int)); 20 H->Size = -1; 21 return H; 22 } 23 24 void Insert(MinHeap H, int Element) 25 { 26 int i = ++H->Size; 27 for (; i > 0 && Element < H->Elements[(i - 1) / 2]; i = (i - 1) / 2) 28 H->Elements[i] = H->Elements[(i - 1) / 2]; 29 H->Elements[i] = Element; 30 } 31 32 void Delete(MinHeap H) 33 { 34 int Tmp = H->Elements[H->Size--]; 35 int Parent; 36 int Child; 37 for (Parent=0;(Parent*2+1)<=H->Size;Parent=Child) 38 { 39 Child = Parent * 2 + 1; 40 if (Child != H->Size && H->Elements[Child] > H->Elements[Child + 1]) 41 Child++; 42 if (Tmp <= H->Elements[Child])break; 43 else 44 H->Elements[Parent] = H->Elements[Child]; 45 } 46 H->Elements[Parent] = Tmp; 47 } 48 49 void PrecDown(MinHeap H,int i) 50 { 51 int Tmp = H->Elements[i]; 52 int Parent; 53 int Child; 54 for (Parent = i; (Parent * 2 + 1) < H->Size; Parent = Child) 55 { 56 Child = Parent * 2 + 1; 57 if (Child != H->Size && H->Elements[Child] > H->Elements[Child + 1]) 58 Child++; 59 if (Tmp <= H->Elements[Child])break; 60 else 61 H->Elements[Parent] = H->Elements[Child]; 62 } 63 H->Elements[Parent] = Tmp; 64 } 65 66 void BuildHeap(MinHeap H) 67 { 68 for (int i = (H->Size - 1) / 2; i>=0; i--) 69 PrecDown(H, i); 70 } 71 72 void Print(MinHeap H,int i) 73 { 74 while (i>0) 75 { 76 printf("%d ", H->Elements[i]); 77 i = (i - 1) / 2; 78 } 79 printf("%d", H->Elements[0]); 80 } 81 int main() 82 { 83 int N, M; 84 scanf("%d %d", &N, &M); 85 MinHeap H = CreatMinHeap(N); 86 for (int i = 0; i < N; i++) 87 { 88 int num; 89 scanf("%d", &num); 90 Insert(H, num); 91 } 92 for (int j = 0; j < M; j++) 93 { 94 int i; 95 scanf("%d", &i); 96 Print(H, i-1); 97 printf("\n"); 98 } 99 }