滴水逆向联盟
标题: VC++2012编程演练数据结构《27》最小堆二叉树 [打印本页]
作者: 大灰狼 时间: 2014-8-21 08:24
标题: VC++2012编程演练数据结构《27》最小堆二叉树
最大堆和最小堆是二叉堆的两种形式。
最大堆:根结点的键值是所有堆结点键值中最大者。
最小堆:根结点的键值是所有堆结点键值中最小者。
而最大-最小堆集结了最大堆和最小堆的优点,这也是其名字的由来。
最大-最小堆是最大层和最小层交替出现的二叉树,即最大层结点的儿子属于最小层,最小层结点的儿子属于最大层。
以最大(小)层结点为根结点的子树保有最大(小)堆性质:根结点的键值为该子树结点键值中最大(小)项。
打开IDE

我们来创建一个工程

类声明如下
[cpp] view plaincopy
- #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 100
-
- class minheap
- {private:
- ElemType *heapArray;
- int maxheapSize;
- int heapsize;
- public:
- //构造一个空堆S
- minheap(int);
- //堆存在则堆被销毁
- void Destroyheap();
- //堆存在则清为空堆
- void Clearheap();
- //堆空则返回true,否则false
- bool heapEmpty();
- //堆满则返回true,否则false
- bool 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_)
类实现如下
[cpp] view plaincopy
- #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);}
类调用如下
[cpp] view plaincopy
- #include "stdafx.h"
-
- #include "minheap.h"
- void PrintArray(int a[],int n)
- {for(int i=0;i<n;i++)
- cout<<setw(3)<<a;
- cout<<endl;
- }
- void main()
- {cout<<"运行结果:\n";
- ElemType b[10];
- srand(350);
- for(int i=0;i<10;i++)
- b=rand()%100;
- cout<<"输出数组b:\n";
- PrintArray(b,10);
- minheap H(10),H1(10);
- for(int i=0;i<10;i++)
- H.heapInsert(b);
- 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://dtdebug.com/) |
Powered by Discuz! X3.2 |