这道题其实就涉及两个堆操作, 一个是插入,一个是通过从底到根的遍历
堆的插入:其实就是从下面往上,一个一个比较,(因为上面的节点里的值越来越小,如果插入的值比上面的节点小那么就要向上推)。
void insert(int X){
int i;
for(i = ++size ; X<H[i/2] ; i = i/2){
H[i] = H[i/2];
}
H[i] = X;
}
堆的路径遍历: 这个更加简单,就是设置一个i,i等于i/2;就可以将那个节点从下往上遍历一遍。
void traversal(int i){
while(i>1){
cout<<H[i]<<" ";
i = i/2;
}
cout<<H[1]<<endl;
}
完整代码:
#include <iostream>
using namespace std;
#define MAXN 1001
#define MINH -10001
int H[MAXN];
int size;
void create(){
size = 0;
//设置一个最小的值,当岗哨
H[0] = MINH;
}
void insert(int X){
int i;
for(i = ++size ; X<H[i/2] ; i = i/2){
H[i] = H[i/2];
}
H[i] = X;
}
void traversal(int i){
while(i>1){
cout<<H[i]<<" ";
i = i/2;
}
cout<<H[1]<<endl;
}
int main(){
int n,m;
cin>>n>>m;
create();
for(int i=0;i<n;i++){
int a;
cin>>a;
insert(a);
}
while(m--){
int i;
cin>>i;
traversal(i);
}
return 0;
}