堆中的路径

将一系列给定数字插入一个初始为空的小顶堆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 #define MAXN 1010
 3 #define MINH -10001
 4 
 5 int HT[MAXN],size;
 6 
 7 void Create()//建立空堆 
 8 {
 9     size=0;
10     HT[0]=MINH;//设置岗哨 
11 }
12 
13 void Insert(int X)//把X放于最后逐个与它的父节点进行比较,很巧妙!
14 {
15     int i;
16     for(i = ++size;HT[i/2]>X;i/=2)
17     {
18         HT[i]=HT[i/2];
19     }
20     HT[i]=X;
21 } 
22 
23 int main()
24 {
25     int  n,m;
26     while(scanf("%d %d",&n,&m)!=EOF)
27     {
28         Create();
29         int i,T;
30         for(i=1;i<=n;i++)
31         {
32             scanf("%d",&T); 
33             Insert(T); 
34         }
35         while(m--)
36         {
37             int g;
38             scanf("%d",&g);
39             for(i=g;i>=1;i/=2)//每次坐标除以2得到它的父节点,并输出就是路径
40             {
41                 if(i==g)
42                     printf("%d",HT[i]);
43                 else
44                     printf(" %d",HT[i]);
45             }
46             printf("\n");
47         }
48     }
49     return 0;
50 }

 

posted @ 2019-04-24 15:18  jiamian22  阅读(889)  评论(0编辑  收藏  举报