VC++2012编程演练数据结构《27》最小堆二叉树

来源:互联网 发布:mac重装win7教程 编辑:程序博客网 时间:2024/06/05 04:12
最大堆和最小堆是二叉堆的两种形式。
  最大堆:根结点的键值是所有堆结点键值中最大者。
  最小堆:根结点的键值是所有堆结点键值中最小者。
  而最大-最小堆集结了最大堆和最小堆的优点,这也是其名字的由来。
  最大-最小堆是最大层和最小层交替出现的二叉树,即最大层结点的儿子属于最小层,最小层结点的儿子属于最大层。

  以最大(小)层结点为根结点的子树保有最大(小)堆性质:根结点的键值为该子树结点键值中最大(小)项。

打开IDE


我们来创建一个工程


类声明如下

#if !defined(AFX_MINHEAP_H__5F262696_5BC2_4DC3_BD5A_54F6DEAD15DA__INCLUDED_)#define AFX_MINHEAP_H__5F262696_5BC2_4DC3_BD5A_54F6DEAD15DA__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include "stdafx.h"//最小堆的类定义minheap.h#define HeapSIZE 10#define MaxHeapSize 100class minheap{private:ElemType *heapArray;int maxheapSize;int heapsize;public://构造一个空堆Sminheap(int);//堆存在则堆被销毁void Destroyheap();//堆存在则清为空堆void Clearheap();//堆空则返回true,否则falsebool heapEmpty();//堆满则返回true,否则falsebool heapFull();// 堆存在则返回堆的元素个数,即堆的长度int heapLength();//堆存在且非空则返回堆的堆顶元素ElemType GetTop();// 插入后的堆调整,使之符合最小堆的定义void FilterUp();//删除后的堆调整,使之符合最小堆的定义void FilterDown();//堆插入void heapInsert(ElemType item);//堆删除ElemType heapDelete();};#endif // !defined(AFX_MINHEAP_H__5F262696_5BC2_4DC3_BD5A_54F6DEAD15DA__INCLUDED_)


类实现如下

#include "stdafx.h"#include "minheap.h"//最小堆的实现minheap.cpp#include "minheap.h"minheap::minheap(int MaxSize){if(MaxSize<=0) {  cerr<<"参数MaxSize非法!\n";exit(1);} heapArray=(ElemType *) new ElemType[MaxSize]; if(!heapArray) exit(-1); maxheapSize=HeapSIZE; heapsize=0;}void minheap::Destroyheap(){free(heapArray);}void minheap::Clearheap(){heapsize=0;}bool minheap::heapEmpty(){ if(heapsize==0) return true;else return false;}bool minheap::heapFull(){return heapsize==maxheapSize;}int minheap::heapLength(){ return heapsize;}ElemType minheap::GetTop(){ if(heapsize==0){cerr<<"堆已空!\n";exit(1);}return heapArray[0];}void minheap::FilterUp(){int c,p;ElemType temp;c=heapsize-1;p=(c-1)/2;temp=heapArray[c];while(c!=0){if(heapArray[p]<=temp) break;heapArray[c]=heapArray[p];c=p;p=(c-1)/2;}heapArray[c]=temp;}void minheap::FilterDown(){int c,p;ElemType temp;p=0;c=2*p+1;temp=heapArray[p];while(c<heapsize){if(c+1<heapsize&&heapArray[c+1]<heapArray[c])c=c+1;if(temp<=heapArray[c]) break;heapArray[p]=heapArray[c];p=c;c=2*p+1;}heapArray[p]=temp;}void minheap::heapInsert(ElemType item){if(heapsize==HeapSIZE){cerr<<"堆已满!\n";exit(1);}heapArray[heapsize]=item;heapsize++;FilterUp();}ElemType minheap::heapDelete(){ElemType temp;if(heapsize==0){cerr<<"堆已空!\n";exit(1);}temp=heapArray[0];heapArray[0]=heapArray[heapsize-1];heapsize--;FilterDown();return(temp);}


类调用如下

#include "stdafx.h"#include "minheap.h"void PrintArray(int a[],int n){for(int i=0;i<n;i++)  cout<<setw(3)<<a[i]; cout<<endl;}void main(){cout<<"运行结果:\n";ElemType b[10];srand(350);for(int i=0;i<10;i++)b[i]=rand()%100;cout<<"输出数组b:\n";PrintArray(b,10);minheap H(10),H1(10);for(int i=0;i<10;i++)H.heapInsert(b[i]);cout<<"输出当前堆H的堆顶元素:\n";cout<<setw(3)<<H.GetTop()<<endl;cout<<"输出插入后数组b:\n";PrintArray(b,10);cout<<"输出逐个删除的H堆中元素:\n";while(!H.heapEmpty())cout<<setw(3)<<H.heapDelete();cout<<endl;for(int i=0;i<10;i++)H1.heapInsert(rand()%100);cout<<"输出当前堆H1的堆顶元素:\n";cout<<setw(3)<<H1.GetTop()<<endl;cout<<"输出逐个删除的H1堆中元素:\n";while(!H1.heapEmpty())cout<<setw(3)<<H1.heapDelete();cout<<endl;H.Destroyheap();H1.Destroyheap(); getch();}


效果如下


代码下载

http://download.csdn.net/detail/yincheng01/4789782

原创粉丝点击