/*
题目——堆中的路径
5 3 插入5次数据,进行3次查找
46 23 26 24 10 输入数据,建立最小堆
5 4 3 打印从H[i]到根节点的路径
*/
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1001
#define MINH -10001
int H[MAXN], size;//定义一个数组,以及当前的最大下标,用size表示
void Create()
{
size = 0;
H[0] = MINH;
}
//插入操作从低向上一个一个比较
void Insert(int X)
{
int i;
size++;//因为插入了一个数据
i = size;//从后向前比较
while (H[i/2]>X)
{
H[i] = H[i/2];//如果发现父节点比X大,那么就把父节点弄下来
i /= 2;
}
H[i] = X;
}
int main()
{
printf("请先输入你要插入的数字数量和要查找的下标,用空格隔开\n");
int insert_num, find_num, insert_data, find_index;
scanf("%d %d", &insert_num, &find_num);
Create();
printf("请输入你要插入的数字\n");
for (int i = 0; i < insert_num; i++)
{
scanf("%d", &insert_data);
Insert(insert_data);
}
printf("请输入你要输出的序号\n");
for (int i = 0; i < find_num; i++)
{
scanf("%d", &find_index);
for (int j = find_index;j > 0;j/=2)
printf("%d ", H[j]);
putchar('\n');
}
return 0;
}
/*
为什么这里实现堆没有用结构体呢?
其实我们也可以用结构体封装一下
typedef struct HeapStruct* MaxHeap;
struct HeapStruct
{
int* data;//用于存放堆元素的数组
int size;//堆的当前元素个数,下标,类似左儿子右儿子的指针,只不过这里用数组下标实现
int capacity;//堆的最大容量
};
MaxHeap H;
这种情况适用于我们需要使用或者创建不同的二叉树堆的时候,但是显然,在本题中我们只用建立一个堆,因此我们不需要封装一个结构体。
而只是建立一个全局变量即可。
*/
数据结构与C语言实现(六)——树(下):题目:堆中的路径
最新推荐文章于 2022-10-19 07:43:57 发布