堆中的路径
将一系列给定数字插入一个初始为空的小顶堆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 }