05-树7 堆中的路径(25 分)

将一系列给定数字插入一个初始为空的小顶堆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\n", 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("\n");
61     }
62 }
63 
64 int main()
65 {
66     int N, M, i;
67     int data;
68     MinHeap mHeap;
69 
70     scanf("%d %d\n", &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("\n");
80     Print(mHeap, M);
81 }

 

posted @ 2018-04-14 16:53  习惯就好233  阅读(377)  评论(0编辑  收藏  举报