堆中的路径
题目描述
思路分析
这道题要求我们根据输入的数字建立小顶堆,并打印从叶节点到根节点的路径
所以我们可以写一个函数去建立小顶堆
将要插入的数加入小顶堆的末尾,再与其父节点的之做比较
如果x小,则把上面的数字复制下来,一直到找到合适的插入位置,把x赋值上去
#include<stdio.h>
#define MinData -10001
#define MaxN 1005
int MinHeap[MaxN],size;//以数组的形式保存
void Insert(int x)
{
size++;
int i; i = size;
MinHeap[i] = x;
for (; x < MinHeap[i / 2]; i /= 2)
{
MinHeap[i] = MinHeap[i / 2];
}
MinHeap[i] = x;
}
int main()
{
MinHeap[0] = MinData;
size = 0;
int N, M;
scanf("%d %d", &N, &M);
while (N--)
{
int num;
scanf("%d", &num);
Insert(num);
}
while (M--)
{
int i;
scanf("%d", &i);
printf("%d", MinHeap[i]);
//打印路径
for (i/=2; i >= 1; i /= 2)
{
printf(" %d", MinHeap[i]);
}
printf("\n");
}
}