一、最大堆和最小堆
最大堆和最小堆是二叉堆的两种形式。
1)最大堆:根节点的值是所有结点中最大的一个
2)最小堆:根节点的值是所有结点中做小的一个
二、基本操作
插入操作:只要将结点插在二叉树最后一个结点位置,然后比较它和父节点的大小,如果大则停止,否则交换位置,然后对父节点递归该过程至根节点。复杂度为O(log(N))
简单的C语言实现:
typedef struct heap {
int arr[127];
int size;
}HEAP;
void insert(HEAP *h,int n){
if(!h) return;
int sz = h->size++;
printf("%d --- %d\n",sz,n);
while(sz>0){
if(n < h->arr[(sz-1)/2]){
h->arr[sz] = h->arr[(sz-1)/2];
sz = (sz-1)/2;
}else{
h->arr[sz] = n;
return;
}
}
h->arr[0] = n;
}
删除操作:要从堆中删除一个结点,用最后一个结点替换掉根结点,然后调整结点顺序以维持堆的特性。
void delete(HEAP *h){
h->size--;
h->arr[0] = h->arr[h->size];
h->arr[h->size] = 0;
int i = 1,cv = h->arr[0],tmp;
while(h->arr[i]>0){
if(h->arr[i] < cv){
h->arr[(i-1)/2] = h->arr[i];
h->arr[i] = cv;
i = i*2 + 1;
}else if(h->arr[i+1] < cv){
h->arr[(i-1)/2] = h->arr[i+1];
h->arr[i+1] = cv;
i = 2*(i+1)+1;
}else{
return;
}
}
}