PTA数据结构与算法题目集(中文)  7-5  堆中的路径

7-5 堆中的路径 (25 分)
 

将一系列给定数字插入一个初始为空的小顶堆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 题目分析:考查最小堆(优先队列)的实现 需要注意的是 利用插入操作建立最小(大)堆 和 先把数据读入完全二叉树 再调整的方法 可能建成的堆不同 并且他们的时间复杂度也不同(插入操作所需要的时间复杂度为 o(nlogn) 第二种方法的时间复杂度为 线性时间)
 #define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h> typedef struct HeapStruct* MinHeap;
struct HeapStruct
{
int Size;
int Capacity;
int* Elements;
}; MinHeap CreatMinHeap(int Capacity)
{
MinHeap H;
H = (MinHeap)malloc(sizeof(struct HeapStruct));
H->Capacity = Capacity;
H->Elements = (int*)malloc(H->Capacity * sizeof(int));
H->Size = -;
return H;
} void Insert(MinHeap H, int Element)
{
int i = ++H->Size;
for (; i > && Element < H->Elements[(i - ) / ]; i = (i - ) / )
H->Elements[i] = H->Elements[(i - ) / ];
H->Elements[i] = Element;
} void Delete(MinHeap H)
{
int Tmp = H->Elements[H->Size--];
int Parent;
int Child;
for (Parent=;(Parent*+)<=H->Size;Parent=Child)
{
Child = Parent * + ;
if (Child != H->Size && H->Elements[Child] > H->Elements[Child + ])
Child++;
if (Tmp <= H->Elements[Child])break;
else
H->Elements[Parent] = H->Elements[Child];
}
H->Elements[Parent] = Tmp;
} void PrecDown(MinHeap H,int i)
{
int Tmp = H->Elements[i];
int Parent;
int Child;
for (Parent = i; (Parent * + ) < H->Size; Parent = Child)
{
Child = Parent * + ;
if (Child != H->Size && H->Elements[Child] > H->Elements[Child + ])
Child++;
if (Tmp <= H->Elements[Child])break;
else
H->Elements[Parent] = H->Elements[Child];
}
H->Elements[Parent] = Tmp;
} void BuildHeap(MinHeap H)
{
for (int i = (H->Size - ) / ; i>=; i--)
PrecDown(H, i);
} void Print(MinHeap H,int i)
{
while (i>)
{
printf("%d ", H->Elements[i]);
i = (i - ) / ;
}
printf("%d", H->Elements[]);
}
int main()
{
int N, M;
scanf("%d %d", &N, &M);
MinHeap H = CreatMinHeap(N);
for (int i = ; i < N; i++)
{
int num;
scanf("%d", &num);
Insert(H, num);
}
for (int j = ; j < M; j++)
{
int i;
scanf("%d", &i);
Print(H, i-);
printf("\n");
}
}
 

最新文章

  1. ASP.NET MVC学习之母版页和自定义控件的使用
  2. Mac下安装与配置Go语言开发环境
  3. Java—数组
  4. Webwork 学习之路【01】Webwork与 Struct 的前世今生
  5. access violation at address General protection fault
  6. leecode 归并排序 链表(java)
  7. 完美逆向百度手机助手5.0底部菜单栏 - Android Tabhost 点击动画
  8. 容易产生错误的where条件
  9. Spring Cloud Netflix多语言/非java语言支持之Spring Cloud Sidecar
  10. JavaScript的DOM编程--10--删除节点
  11. JS 数组方法
  12. [knowledge][http] http
  13. jmeter学习(1)基础支持+安装部署
  14. python算两个时间之间的天数,将天数转成int型
  15. POJ 2823 (滑动窗口)
  16. 如何在 C#中添加 dll 文件
  17. Linux 上安装Gearman及其PHP扩展
  18. java和c/c++
  19. Codeforces Round #299 (Div. 2) B. Tavas and SaDDas【DFS/*进制思维/位运算/一个数为幸运数,当且仅当它的每一位要么是4,要么是7 ,求小于等于n的幸运数个数】
  20. POJ 2987 Firing(最大权闭合图)

热门文章

  1. css3 HSLA 颜色制造半透明效果
  2. MATLAB神经网络(1)之R练习
  3. css 实战技巧
  4. css中:overflow:hidden清除浮动的原理
  5. js 拖拽实现面向对象
  6. mysqli_query($conn, &quot;set names utf8&quot;); //**设置字符集*** 不设置插入数据库就是乱码
  7. 从原子类和Unsafe来理解Java内存模型,AtomicInteger的incrementAndGet方法源码介绍,valueOffset偏移量的理解
  8. Symantec NBU :Unable to retrieve version of the server xxx.xxx.xxx
  9. rbac权限+中间件 初识
  10. python浅学【网络服务中间件】之MongoDB