题目
将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。
思路
此题主要考察使用插入的方式建立小根堆,堆得插入主要是要循环与其父节点进行比较。
代码
void insert(int x);
void Print(int x);
int data[N],index=0;
int n,m;
void main(){
int i,x;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++){
scanf("%d",&x);
insert(x);
}
for(i=0;i<m;i++){
scanf("%d",&x);
Print(x);
printf("\n");
}
system("pause");
}
void insert(int x){
int flat,temp,k;
data[++index]=x;
flat=index;
while(flat!=1){
k=flat/2;
if(data[k]>data[flat]){
temp=data[flat];
data[flat]=data[k];
data[k]=temp;
}
flat=k;
}
}
void Print(int x){
while(x>0){
printf(" %d",data[x]);
x/=2;
}
}
总结
注意本题是要插入的方法创建一个小根堆,这与我们熟知的堆排序,已知序列然后调整建立的小根堆是不同的(本人尝试过两种方法,最后输出的路径会有差异)。