Fork me on GitHub

05-树7 堆中的路径

题目

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

输入格式:

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

输出格式:

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

输入样例:

5 3
46 23 26 24 10
5 4 3

输出样例:

24 23 10
46 23 10
26 10

AC代码

/*!
 * \file 05-树7 堆中的路径.cpp
 *
 * \author ranjiewen
 * \date 2017/04/08 23:44
 *
 * 
 */

#define MAXN 1001
#define MINH -1001

int H[MAXN], size;

void Create() //创建小顶堆
{
	size = 0;
	H[0] = MINH;
}

void Insert(int x)
{
	//将x插入到H中, 这里省略对是否已满的判断
	int i;
	for (i = ++size; H[i / 2] > x;i/=2)
	{
		H[i] = H[i / 2];
	}
	H[i] = x;
}
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int n, m;
	int x;
	int 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]); //可以将j=1输出 //这里不需要设标志输出控制
		}
		printf("\n"); 
	}

	return 0;
}

posted @ 2017-04-09 00:20  ranjiewen  阅读(553)  评论(0编辑  收藏  举报