最小堆的調整、插入和刪除

今天看到一道面試題,

一個最小堆,也是完全二叉樹,用按層遍歷數組表示。
  1.  求節點a[n]的子節點的訪問方式
  2.  插入一節點的程序void add_element(int *a,int size,int val);
  3.  刪除最小節點的程序。

剛看到的時候覺得挺難的,沒有什麼思路,原因在於對最小堆的完全二叉樹不瞭解,其實這個二叉樹和堆排序時建立的二叉樹是一樣的。

1、按照數組下標,下標爲n的節點,它的子結點下標爲2*n+1和2*n+2;

2、插入節點時,先插入到最後,然後再調整堆。

3、刪除最小節點即刪除根節點,先將根節點和最後一個節點交換,再調整堆。

  1. #include "stdafx.h" 
  2. #include<iostream>   
  3. using namespace std;   
  4.  
  5. //往最小堆中插入元素,先插在數組的最後,然後類似於插入排序找到合適位置。 
  6. void MinHeapAdd(int *a,int n,int number) 
  7. {    
  8.     a[n]=number; 
  9.     int i=n; 
  10.     int j=(i-1)/2; 
  11.     int tmp=a[i]; 
  12.      
  13.     while(j>=0) 
  14.     { 
  15.         if(a[j]<=tmp) 
  16.             break
  17.         else 
  18.         { 
  19.             a[i]=a[j]; 
  20.             i=j; 
  21.             j=(i-1)/2; 
  22.         } 
  23.     } 
  24.     a[i]=tmp; 
  25. //從第m個開始調整,n爲結點總數 類似於插入排序 
  26. void MinHeapFixDown(int *a,int m,int n) 
  27.     int i=m; 
  28.     int j=2*i+1; 
  29.     int tmp=a[i]; 
  30.     while(j<n) 
  31.     { 
  32.         if(j+1<n&&a[j]>a[j+1]) 
  33.             j++; 
  34.         if(a[j]>=tmp) 
  35.             break
  36.         else 
  37.         { 
  38.             a[i]=a[j]; 
  39.             i=j; 
  40.             j=2*i+1; 
  41.         } 
  42.     } 
  43.     a[i]=tmp; 
  44.  
  45. //刪除最小節點 
  46. void MinHeapDelete(int *a,int n) 
  47.     a[0]=a[n-1]; 
  48.     MinHeapFixDown(a,0,n-1); 
  49. //初始建堆 
  50. void MakeMinHeap(int *a,int n) 
  51.     for(int i=n/2-1;i>=0;i--)//注意 
  52.         MinHeapFixDown(a,i,n); 
  53. //堆排序 
  54. void HeapSort(int *a,int n) 
  55.     MakeMinHeap(a,n); 
  56.     for(int i=n-1;i>=1;i--) 
  57.     { 
  58.         int tmp=a[0];a[0]=a[i];a[i]=tmp; 
  59.         MinHeapFixDown(a,0,i); 
  60.     } 
  61. void main()   
  62. {  
  63.     int a[10]={36,30,18,40,32,45,22,50}; 
  64.     HeapSort(a,8); 
  65.     for(int i=0;i<8;i++) 
  66.         cout<<a[i]<<" "
  67.     cout<<endl; 
  68.     int aa[10]={36,30,18,40,32,45,22,50}; 
  69.     MakeMinHeap(aa,8); 
  70.     for(int i=0;i<8;i++) 
  71.         cout<<aa[i]<<" "
  72.     cout<<endl; 
  73.     MinHeapAdd(aa,8,35); 
  74.     for(int i=0;i<9;i++) 
  75.         cout<<aa[i]<<" "
  76.     cout<<endl; 
  77.     MinHeapDelete(aa,9); 
  78.     for(int i=0;i<8;i++) 
  79.         cout<<aa[i]<<" "
  80.     cout<<endl; 
  81.     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章