PAT 05-树6 Path in a Heap

这次的作业完全是依葫芦画瓢,参照云课堂《数据结构》(http://mooc.study.163.com/learn/ZJU-1000033001#/learn/content)中何钦铭老师课件中有关建堆及插入的内容,再加上自己写的一个矬函数(竟然传了4个参数),OK了!题设要求及代码实现如下

  1 /*
  2     Name: 
  3     Copyright: 
  4     Author: 
  5     Date: 05/04/15 19:34
  6     Description: 
  7 Insert a sequence of given numbers into an initially empty min-heap H. Then for any given index i, you are supposed to print the path from H[i] to the root.
  8 
  9 Input Specification:
 10 
 11 Each input file contains one test case. For each case, the first line gives two positive integers N and M (<=1000) which are the size of the input sequence, and the number of indices to be checked, respectively. Given in the next line are the N integers in [-10000, 10000] which are supposed to be inserted into an initially empty min-heap. Finally in the last line, M indices are given.
 12 
 13 Output Specification:
 14 
 15 For each index i in the input, print in one line the numbers visited along the path from H[i] to the root of the heap. The numbers are separated by a space, and there must be no extra space at the end of the line.
 16 
 17 Sample Input:
 18 5 3
 19 46 23 26 24 10
 20 5 4 3
 21 Sample Output:
 22 24 23 10
 23 46 23 10
 24 26 10
 25 */
 26 
 27 #include <stdio.h>
 28 #include <stdlib.h>
 29 
 30 #define MinData -10001
 31 
 32 typedef struct HeapStruct
 33 {
 34     int * Elements;
 35     int Size;
 36     int Capacity;
 37 } * MinHeap;
 38 
 39 MinHeap Create(int MaxSize);
 40 void Insert(MinHeap H, int item);
 41 void Print(MinHeap H, int * a, int N, int M);
 42 
 43 int main()
 44 {
 45 //    freopen("in.txt", "r", stdin); // for test
 46     int N, M, i, item;
 47     MinHeap H;
 48     
 49     scanf("%d%d", &N, &M);
 50     
 51     H = Create(N);
 52     for(i = 0; i < N; i++)
 53     {
 54         scanf("%d", &item);
 55         Insert(H, item);
 56     }
 57     
 58     int a[M];
 59     
 60     for(i = 0; i < M; i++)
 61         scanf("%d", &a[i]);
 62         
 63     Print(H, a, N, M);
 64 //    fclose(stdin); // for test
 65     return 0;
 66 }
 67 
 68 MinHeap Create(int MaxSize)
 69 {
 70     MinHeap H = (MinHeap)malloc(sizeof(struct HeapStruct));
 71     H->Elements = (int *)malloc((MaxSize + 1) * sizeof(int));
 72     H->Size = 0;
 73     H->Capacity = MaxSize;
 74     H->Elements[0] = MinData;
 75     
 76     return H;
 77 }
 78 
 79 void Insert(MinHeap H, int item)
 80 {
 81     int i;
 82     
 83     i = ++H->Size;
 84     for(; H->Elements[i / 2] > item; i /= 2)
 85         H->Elements[i] = H->Elements[i / 2];
 86     H->Elements[i] = item;
 87 }
 88 
 89 void Print(MinHeap H, int * a, int N, int M)
 90 {
 91     int i;
 92     
 93     for(i = 0; i < M; i++)
 94     {
 95         if(a[i] <= N)
 96         {
 97             while(a[i])
 98             {
 99                 printf("%d", H->Elements[a[i]]);
100                 if(a[i] > 1)
101                     printf(" ");
102                 else
103                     printf("\n");
104                 a[i] /= 2;
105             }
106         }
107     }
108 }

 

posted @ 2015-04-05 20:34  自由的青  阅读(270)  评论(0编辑  收藏  举报