05-树7 堆中的路径

来源:互联网 发布:oracle 防火墙端口 编辑:程序博客网 时间:2024/06/05 02:57

将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。

输入格式:

每组测试第1行包含2个正整数NNNMMM(≤1000\le 10001000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的NNN个要被插入一个初始为空的小顶堆的整数。最后一行给出MMM个下标。

输出格式:

对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。

输入样例:

5 346 23 26 24 105 4 3

输出样例:

24 23 1046 23 1026 10


运行超时了。。。。

#define MAXN 1001#define MINH -10001int H[MAXN],size    //数组来装堆(完全二叉树),i为父节点,左儿子为i*-1,右儿子为i*2void Create(){size = 0;H[0] = MINH;}void Insert(int X){int i;if(size==1000) // 堆已满        return;for(i=++size;H[i/2]>X;i/2){H[i] = H[i/2];      //从1开始插入,对比每个节点的父节点与当前插入的节点哪个大,哪个小,这是一个最小堆,要求父节点都小于子节点}H[i] = X;}int main(){int n,m,x,i,j;scanf("%d %d",&n,&m);Create();for(i=0;i<n;i++){scanf("%d",&x);Insert(x);}for(i=0;i<m;i++){scanf("%d";&j);printf("%d",H[j]);while(j>1){j /= 2;printf("%d",H[j]);}printf("\n");}return 0;}


0 0
原创粉丝点击