7-5 堆中的路径

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


/*
    Name:
    Copyright:
    Author:  流照君
    Date: data
    Description:
*/
#include <iostream>
#include<string>
#include <algorithm>
#include <vector>
#define inf 100005
using namespace std;
typedef long long ll;
typedef int element_type;
typedef struct node *heap;
struct node{
	   element_type *data;
	   int size;
	   int capacity;
};
heap creat_heap(int n)
{
	heap min_heap=(heap)malloc(sizeof(heap));
	min_heap->data=(element_type*)malloc((n+1)*sizeof(element_type));
	min_heap->size=0;
	min_heap->capacity=n+1;
	min_heap->data[0]=-inf;
	return min_heap;
}
void insert(heap min_heap,int v)
{
	if(min_heap->size==min_heap->capacity-1)
	return ;
	min_heap->data[++min_heap->size]=v;
	int i=min_heap->size;
	for(;min_heap->data[i/2]>v;i=i/2)
		 min_heap->data[i]=min_heap->data[i/2];
	 min_heap->data[i]=v;
}
int main(int argc, char** argv)
{
#ifdef ONLINE_JUDGE//条件编译,如果有oj则忽略文件读取
#else
	//freopen("in.txt", "r", stdin);//输入输出文件重定向
	//freopen("out.txt", "w", stdout);
#endif  //#if, #ifdef, #ifndef这些条件命令的结束标志.
//代码位置
	int n,t,temp,cnt;
	heap heap1;
	cin>>n>>t;
	heap1=creat_heap(n);
	for(int i=1;i<=n;i++)
	{
		 cin>>temp;
		 insert(heap1,temp);
	}
	while(t--)
	{
		cin>>cnt;
		for(int i=cnt;i>1;i=i/2)
		{
			cout<<heap1->data[i]<<" ";
		}
		cout<<heap1->data[1]<<endl;
	}
    return 0;
}

  

posted @ 2020-03-02 21:14  流照君  阅读(208)  评论(0编辑  收藏  举报