C语言实现:将一系列给定数字依次插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。 输入格式: 每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。 输出格式: 对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。
时间: 2024-03-26 20:40:42 浏览: 57
C语言《一维数组和冒泡算法》完整版资料.ppt
以下是 C 语言的实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 1005
int heap[MAX_N];
int n, m;
void upAdjust(int i) {
int temp = heap[i];
int j = (i - 1) / 2;
while (i > 0 && heap[j] > temp) {
heap[i] = heap[j];
i = j;
j = (i - 1) / 2;
}
heap[i] = temp;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d", &heap[i]);
upAdjust(i);
}
for (int i = 0; i < m; i++) {
int index;
scanf("%d", &index);
while (index >= 1) {
printf("%d ", heap[index]);
index = (index - 1) / 2;
}
printf("\n");
}
return 0;
}
```
解释如下:
1. 首先定义一个大小为 MAX_N 的数组 heap,表示小顶堆;
2. 接着输入 n 和 m;
3. 然后依次输入 n 个数字,并调用 upAdjust 函数将它们插入小顶堆中;
4. 最后依次输入 m 个下标,对于每个下标,从该位置一直往上遍历到根节点,并输出路径上的数字。
其中,upAdjust 函数的作用是将一个新插入的数字上浮到合适的位置以维护小顶堆的性质。具体来说,它先将要插入的数字暂存到 temp 变量中,然后重复执行以下操作:将该数字与其父节点比较,如果父节点比它大,则将父节点下移,否则跳出循环。最后将该数字存入合适的位置。
阅读全文