STL原始碼—heap最大堆,最小堆
阿新 • • 發佈:2019-02-07
最大堆和最小堆都是一棵完全二叉樹。
最大堆:是指根節點的關鍵字值是堆中的最大關鍵字值,且每個節點若有兒子節點,其關鍵字值都不小於其兒子節點的關鍵字值。
最小堆:是指根節點的關鍵字值是堆中的最小關鍵字值,且每個節點若有兒子節點,其關鍵字值都不大於其兒子節點的關鍵字值。
最大堆的插入操作
步驟:
- 把當前節點數i設定為已知堆的節點數加1即i=++(*n),即新增的元素放在最下一層作為新的葉子節點。求出節點i的父節點parent=i/2;判斷是否為空堆,並比較所插入元素與父節點關鍵字值的大小;
- 若所插入節點關鍵字值大於父節點關鍵字值即item>heap[parent],則把父節點向下移,並把父節點作為當前節點,依次求父節點,即依次沿著樹枝向上延伸;
- 把元素item插入到正確位置;
最大堆的刪除操作
最大堆的刪除,即刪除最大的元素。我們先取最後的元素提到根結點,然後刪除最大值,然後再把新的根節點放到合適的位置。
#include <stdio.h> #include <stdlib.h> #define MAX_SIZE 10 int heap[MAX_SIZE]; /*最大堆的插入操作*/ /*注:堆的下標是從1開始,而不是0*/ void max_Heap_insert(int *heap,int *n,int item) { int i,parent;//i為當前節點,parent為i的父節點 if((*n)==MAX_SIZE)//堆為滿 { printf("The heap is full\n"); exit(1); } i=++(*n); parent=i/2; while((i!=1) && (item>heap[parent]))//若堆為非空,且所插入資料item大於父節點的關鍵字值 { heap[i]=heap[parent];//父節點關鍵字值下移 i=parent;//把父節點作為當前節點 parent/=2;//依次求父節點 } heap[i]=item;//插入到正確的位置 } /*最大堆的刪除操作*/ int max_Heap_delete(int *heap,int *n) { int item,temp; int child,parent; if(*n==0)//若為空堆 { printf("The heap is empty.\n"); exit(1); } item=heap[1];//把最大堆的最大元素賦給item temp=heap[(*n)--];//堆的最後節點關鍵字值 parent=1; child=2*parent; while(child<=(*n)) //<迴圈次數的限制 { if(child<*n && heap[child]<heap[child+1]) child++;//找出堆中最大關鍵字值的節點 if(temp>=heap[child])break;//把最大節點關鍵字值與最後節點關鍵字值比較 else {//若堆中存在比最後節點關鍵字值大的節點,則交換位置 heap[parent]=heap[child]; parent=child; child*=2; } } heap[parent]=temp;//插入到正確位置 return item;//返回刪除的關鍵字值 } int main() { int item,i; int n=0; for(i=1;i<MAX_SIZE;i++) { scanf("%d",&item); max_Heap_insert(heap,&n,item); } for(i=1;i<=n;i++) printf("%d ",heap[i]); printf("\n"); item=max_Heap_delete(heap,&n); printf("The deleted data is:%d",item); printf("\n"); for(i=1;i<=n;i++) printf("%d ",heap[i]); return 0; }
輸出:
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