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 }

 

posted @ 2018-10-24 16:12  shenqingping  阅读(194)  评论(0)    收藏  举报