最小堆的调整、插入和删除

来源:互联网 发布:axure7.0 mac 中文版 编辑:程序博客网 时间:2024/06/04 18:42

今天看到一道面试题,

一个最小堆,也是完全二叉树,用按层遍历数组表示。
  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.     

 摘自:http://buptdtt.blog.51cto.com/2369962/864190

原创粉丝点击