#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define Max 1000
typedef struct heap *hp;
struct heap{
int *data;
//int size; 为什么size会变化
};
void creat(hp H,int n,int m) //创建最小堆 H->size在传递过程中的值会变化,为什么?传递的不是地址吗?不相当于引用吗?
{
int i;
H->data[m]=n; //插入放在最后的位置
for(i=m;H->data[i]<H->data[i/2];i=i/2){ //向上找到应该插入的位置
int x=H->data[i/2]; //不必交换位置的,可以在找到位置后再进行插入,当然在路径上的节点会往下移
H->data[i/2]=H->data[i];
H->data[i]=x;
}
}
int main()
{
hp H=(hp)malloc(sizeof(hp));
H->data=(int *)malloc((Max+1)*sizeof(int));
H->data[0]=-10001; //哨兵,相当于0节点必定为根结点,这样在循环比较时就不会多加i>=0之类的条件了,
int N,M,i,n;
scanf("%d %d",&N,&M);
for(i=1;i<=N;i++){ //建立最小堆,插入法,如果用先顺序存储在数组中,再进行调整建堆,则不满足题目的要求,因为堆的结构并不唯一
scanf("%d",&n);
creat(H,n,i);
}
for(i=0;i<M;i++){ //根据输入的位置输出路径,
scanf("%d",&n);
for(n;n>1;n=n/2)printf("%d ",H->data[n]); //最后必定会输出根结点 ,所以在n=2,3时就退出循环,使输出满足要求
printf("%d\n",H->data[1]);
}
return 0;
}
05-树7 堆中的路径(25 分)
最新推荐文章于 2022-04-15 22:13:25 发布