这里举例用最大堆,最小堆同理
一、堆的两个特性
- 结构性:用数组表示的完全二叉树
- 有序性:任一结点的关键字是其子树所有结点的最大值或最小值
二、区分最大堆和最小堆
- 最大堆:最大值(MaxHeap)
- 最小堆:最小值(MinHeap)
三、堆的抽象数据类型描述:
四、最大堆的建立:
方法一:
#include <stdio.h>
#include <stdlib.h>
#define MinData -10001
#define MaxData 10001
typedef struct Heap *MinHeap;
typedef int ElementType;
struct Heap{
ElementType *Elements;
int Size;
int Capacity;
};
MaxHeap Create(int MaxSize)
{
MinHeap H = (MinHeap)malloc(sizeof(struct Heap));
H->Elements = (ElementType *)malloc((MaxSize+1)*sizeof(ElementType));
H->Size = 0;
H->Capacity = MaxSize;
H->Elements[0] = MaxData;
return H;
}
方法二:
#include<iostream>
using namespace std;
#define MAXN 1001
#define MINH -10001
#define MIN 10001
int H[MAXN],size;
void Create()
{
size = 0;
H[0] = MINH;
}
五、最大堆的插入
方法一:
void Insert(MinHeap H,ElementType X)
{
int i;
if(IsFull(H)){
printf("堆已满");
return ;
}
i = ++H->Size;
for(;X>H->Elements[i/2];i/=2)
H->Elements[i] = H->Elements[i/2];
H->Elements[i] = X;
}
方法二:
void Insert(int x)
{
int i;
for(i = ++size; x>H[i/2]; i/=2)
H[i] = H[i/2];
H[i] = x;
}
六、最大堆的删除
方法一:
int DeleteMax(MinHeap H)
{
int Parent,Child;
int MaxItem,temp;
if(IsEmpty(H))
{
printf("最大堆空");
return ;
}
MaxItem=H->Elements[1];
temp=H->Elements[H->Size--];
for(Parent=1;Parent*2<=H->Size;Parent=Child)
{
Child=Parent*2;
if((Child!=H->Size)&&(H->Elements[Child]<H->Elements[Child+1]))
Child++;
if(temp>=H->Elements[Child])
break;
else
H->Elements[Parent]=H->Elements[Child];
}
H->Elements[Parent]=temp;
return MaxItem;
}
七、最大堆的打印
void PrintRoad(MinHeap H,int k)
{
printf("%d",H->Elements[k]);
while(k>1)
{
k/=2;
printf(" %d",H->Elements[k]);
}
puts("");
}
for(int i = 0; i < m; i++){
cin>>temp;
cout<<H[temp];
while(temp>1){
temp /= 2;
cout<<" "<<H[temp];
}
cout<<endl;
}