堆的定义:
const int MAXN=1010;
int n=0;//初始堆大小
int heap[MAXN];
堆的建立(以小顶堆为例):
//向下调整
void downAdjust(int low,int high){
int i=low,j=i*2;
while(j<=high){
if(j+1<=high&&heap[j+1]<heap[j]){
j=j+1;
}
if(heap[j]<heap[i]){
swap(heap[j],heap[i]);
i=j;
j=i*2;
}else{
break;
}
}
}
//向上调整
void upAdjust(int low,int high){
int i=high,j=i/2;
while(j>=low){
if(heap[j]>heap[i]){
swap(heap[j],heap[i]);
i=j;
j=i/2;
}else{
break;
}
}
}
//方法1.若存在初始数组,通过向下调整创建(n为初始节点个数)
void createHeap(){
for(int i=n/2;i>=1;i--){
downAdjust(i,n);
}
}
//方法2.若堆初始为空,通过不断插入向上调整创建(n=0)
void insert(int x){
heap[++n]=x;
upAdjust(1,n);
}
输出路径:
//递归(堆顶到指定节点)
void printPath1(int idx){
if(idx==1)printf("%d",heap[idx]);
else{
printPath1(idx/2);
printf(" %d",heap[idx]);
}
}
//指定节点到堆顶
void printPath2(int idx){
while(idx>1){
printf("%d ",heap[idx]);
idx/=2;
}
printf("%d",heap[1]);
}