二叉堆
二叉堆是二叉树的一中,可以理解为完全二叉树,而二叉堆分两种,一种是最大堆(即父节点大于或等于子节点),另一种是最小堆(即父节点小于等于子节点)。
它的常用操作有插入,查询和删除。
以最小堆为例,先把需要插入的元素放在底部,再通过交换子树(也是堆)的根节点和叶结点来移动这个插入的新元素,直到符合条件(即父节点小于等于子节点)。
插入
代码如下:
int heap[1000],i=0;
void push(int n)
{
heap[++i]=n;//插入到堆底
now=i;
while(now)
{
int next=now/2;//找它的父亲
if(heap[next]>heap[now])
{
int t=heap[next];
heap[next]=heap[now];
heap[now]=t;
}//父亲比它大,那就交换
else
break;//父亲比它小,那就代表着插入完成了
now=nxt;//继续下一轮的比较
}
return;
}
删除。
删除比较麻烦,因为我们要保证操作完成后仍然符合二叉堆的性质,因此我们要先将元素沉到树底,再进行操作。
void pop(int n)
{
int t=heap[n];
heap[n]=heap[i];
heap[i]=t;
i--;
while((now*2)<=siz) //对该节点进行向下交换的操作
{
int next=n*2;//找出当前节点的左儿子
if(next+1<=i&&heap[next+1]<heap[next])
next++;//比较左儿子和右儿子哪个更小
if(heap[next]<heap[n])
{
t=heap[next];
heap[next]=heap[n];
heap[n]=t;
}
else
break;
n=next;//往下一层继续向下交换
}
}