PTA数据结构与算法题目集(中文) 7-5
2024-09-06 07:44:26
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");
}
}
最新文章
- ASP.NET MVC学习之母版页和自定义控件的使用
- Mac下安装与配置Go语言开发环境
- Java—数组
- Webwork 学习之路【01】Webwork与 Struct 的前世今生
- access violation at address General protection fault
- leecode 归并排序 链表(java)
- 完美逆向百度手机助手5.0底部菜单栏 - Android Tabhost 点击动画
- 容易产生错误的where条件
- Spring Cloud Netflix多语言/非java语言支持之Spring Cloud Sidecar
- JavaScript的DOM编程--10--删除节点
- JS 数组方法
- [knowledge][http] http
- jmeter学习(1)基础支持+安装部署
- python算两个时间之间的天数,将天数转成int型
- POJ 2823 (滑动窗口)
- 如何在 C#中添加 dll 文件
- Linux 上安装Gearman及其PHP扩展
- java和c/c++
- Codeforces Round #299 (Div. 2) B. Tavas and SaDDas【DFS/*进制思维/位运算/一个数为幸运数,当且仅当它的每一位要么是4,要么是7 ,求小于等于n的幸运数个数】
- POJ 2987 Firing(最大权闭合图)
热门文章
- css3 HSLA 颜色制造半透明效果
- MATLAB神经网络(1)之R练习
- css 实战技巧
- css中:overflow:hidden清除浮动的原理
- js 拖拽实现面向对象
- mysqli_query($conn, ";set names utf8";); //**设置字符集*** 不设置插入数据库就是乱码
- 从原子类和Unsafe来理解Java内存模型,AtomicInteger的incrementAndGet方法源码介绍,valueOffset偏移量的理解
- Symantec NBU :Unable to retrieve version of the server xxx.xxx.xxx
- rbac权限+中间件 初识
- python浅学【网络服务中间件】之MongoDB