数据结构-二叉堆

来源:互联网 发布:linux编辑模式怎么换行 编辑:程序博客网 时间:2024/06/06 04:54

(1)删除优先级最小的元素deletemin()
此操作分为3步:直接删除根;用最后一个元素代替根;将堆向下重新调整。
因为是最小堆,从根heap[1]开始,选取当前节点p的较小的儿子q。如果比p大,则调整停止,否则交换p和儿子的值,继续调整。

 (2)向堆中插入一个新元素insert(x)
插入元素是先添加到末尾,再向上调整。

向上调整:比较当前节点p和其父节点,如果父节点比p小,则停止;否则交换父节点和p的值。继续从下向上调整。

(3)将p的优先级减小为a:

(4)建立堆build();


实现代码如下:

#include<iostream>using namespace std;int heap[]={4,1,3,2,16,9,10,14,8,7};int n;void down(int p){int q = p*2+1;  //q为p的左儿子while(q <= n-1){  //n为堆中元素个数//选取两个儿子中的最小的一个if(q < n-1 && heap[q] > heap[q+1])  q++;if(heap[q] >= heap[p])            break;  //如果儿子比父节点大,就结束。否则交换else{            int a = heap[p];            heap[p] = heap[q];            heap[q] = a;p = q;q = 2*p+1;        }}}int deletemin(){int r = heap[1];  //取出最小元素heap[1] = heap[n--];  //把最后一个节点赋给根节点down(1);  //向下调整return r;}void up(int p){int q = p/2;  //计算当前节点p的父节点while(q >= 0 && heap[p] < heap[q]){//如果当前节点的值小于父节点的值,则交换int a = heap[p];heap[p] = heap[q];heap[q] = a;p = q;q = p/2;}}void insert(int a){heap[++n] = a;  //先往堆里插入节点值up(n);//向上进行调整}void increasekey(int p, int a){if(heap[p] < a)return;heap[p] = a;up(p);}void build(){for(int i = n/2; i >= 0; --i)down(i);}int main(){    n=sizeof(heap)/sizeof(heap[0]);    //可根据实际需要调用函数;    for(int i=0;i<n;i++)    {        cout<<heap[i]<<"  ";    }    return 0;}



原创粉丝点击