STL源码—heap最大堆,最小堆(TT)

来源:互联网 发布:js json特殊字符处理 编辑:程序博客网 时间:2024/05/22 00:53

 最大堆和最小堆都是一棵完全二叉树。

    最大堆:是指根节点的关键字值是堆中的最大关键字值,且每个节点若有儿子节点,其关键字值都不小于其儿子节点的关键字值。

    最小堆:是指根节点的关键字值是堆中的最小关键字值,且每个节点若有儿子节点,其关键字值都不大于其儿子节点的关键字值。



最大堆的插入操作

   步骤:

  1. 把当前节点数i设置为已知堆的节点数加1即i=++(*n),即新增的元素放在最下一层作为新的叶子节点。求出节点i的父节点parent=i/2;判断是否为空堆,并比较所插入元素与父节点关键字值的大小;
  2. 若所插入节点关键字值大于父节点关键字值即item>heap[parent],则把父节点向下移,并把父节点作为当前节点,依次求父节点,即依次沿着树枝向上延伸;
  3. 把元素item插入到正确位置;

最大堆的删除操作

    最大堆的删除,即删除最大的元素。我们先取最后的元素提到根结点,然后删除最大值,然后再把新的根节点放到合适的位置。

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>    
  2. #include <stdlib.h>    
  3. #define MAX_SIZE 10    
  4. int heap[MAX_SIZE];    
  5.   
  6. /*最大堆的插入操作*/    
  7. /*注:堆的下标是从1开始,而不是0*/    
  8. void max_Heap_insert(int *heap,int *n,int item)    
  9. {    
  10.     int i,parent;//i为当前节点,parent为i的父节点    
  11.     if((*n)==MAX_SIZE)//堆为满    
  12.     {    
  13.         printf("The heap is full\n");    
  14.         exit(1);    
  15.     }    
  16.     i=++(*n);    
  17.     parent=i/2;    
  18.     while((i!=1) && (item>heap[parent]))//若堆为非空,且所插入数据item大于父节点的关键字值    
  19.     {    
  20.         heap[i]=heap[parent];//父节点关键字值下移    
  21.         i=parent;//把父节点作为当前节点    
  22.         parent/=2;//依次求父节点    
  23.     }    
  24.     heap[i]=item;//插入到正确的位置    
  25. }    
  26. /*最大堆的删除操作*/    
  27. int max_Heap_delete(int *heap,int *n)    
  28. {    
  29.     int item,temp;    
  30.     int child,parent;    
  31.     if(*n==0)//若为空堆    
  32.     {    
  33.         printf("The heap is empty.\n");    
  34.         exit(1);    
  35.     }    
  36.     item=heap[1];//把最大堆的最大元素赋给item    
  37.     temp=heap[(*n)--];//堆的最后节点关键字值    
  38.     parent=1;    
  39.     child=2*parent;    
  40.     while(child<=(*n))  //<循环次数的限制  
  41.     {    
  42.         if(child<*n && heap[child]<heap[child+1])    
  43.             child++;//找出堆中最大关键字值的节点    
  44.         if(temp>=heap[child])break;//把最大节点关键字值与最后节点关键字值比较    
  45.         else    
  46.         {//若堆中存在比最后节点关键字值大的节点,则交换位置    
  47.             heap[parent]=heap[child];    
  48.             parent=child;    
  49.             child*=2;    
  50.         }    
  51.     }    
  52.     heap[parent]=temp;//插入到正确位置    
  53.     return item;//返回删除的关键字值    
  54. }    
  55. int main()    
  56. {    
  57.     int item,i;    
  58.     int n=0;    
  59.     for(i=1;i<MAX_SIZE;i++)    
  60.     {    
  61.         scanf("%d",&item);    
  62.         max_Heap_insert(heap,&n,item);    
  63.     }    
  64.     for(i=1;i<=n;i++)    
  65.         printf("%d ",heap[i]);    
  66.     printf("\n");    
  67.     item=max_Heap_delete(heap,&n);    
  68.     printf("The deleted data is:%d",item);    
  69.     printf("\n");    
  70.     for(i=1;i<=n;i++)    
  71.         printf("%d ",heap[i]);    
  72.     return 0;    
  73. }    

输出:

1 2 32 12 55 334 7 23 7 67
334 32 55 23 12 2 7 1 7
The deleted data is:334
55 32 7 23 12 2 7 1

0 0
原创粉丝点击