将一系列给定数字插入到一个初始为空的最小堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。
输入样例:
5 3
46 23 26 24 10
5 4 3
输出样例:
24 23 10
46 23 10
26 10
以下是代码及分析:
#include <iostream>
using namespace std;
#define MAX 1001 //因为根结点从下标为1的地方开始,所以最大长度设为1001
#define MIN -10001
int H[MAX],size; //size表示当前堆的大小
//Create建立一个空堆
void Create(){
size = 0;
H[0] = MIN; //因为根结点是从下标为一的地方开始,所以0这个地方是空缺的。此处将H[0]设为最小值,下面插入操作方便(不会产生越界)
}
//插入操作,从下往上作比较
void Insert(int X){
int i;
//因为是最小堆,所以父结点H[i/2]比子树小
for(i = ++ size; H[i/2] > X; i /= 2){
H[i] = H[i/2];
} //如果H[i/2]比X大,就用i/=2把i挪到上一个位置去
H[i] = X; //如果退出循环,就是父结点<=X,当前位置就是要插入的位置
}
int main(){
int n,m,x,i,j;
cin>>n>>m;
Create(); //堆初始化
for(i = 0;i < n;i++){
cin>>x;
Insert(x);
} //读入并建堆
//接下来的循环,每次循环都读入一个数,作为待查找的位置
for(i = 0;i < m;i++){
cin>>j;
cout<<H[j]; //先打印这个位置的元素值
while(j>1){ //j这个位置到根结点的所有祖先都打印出来
j /= 2;
cout<<" "<<H[j];
}
cout<<endl;
}
return 0;
}