堆结构的C++模板类实现

来源:互联网 发布:macbook pro和mac air 编辑:程序博客网 时间:2024/05/19 16:33

数据结构中堆的概念不同于“堆栈”,它是指一种完全二叉树,这种二叉树的任一节点的关键字大于(或小于)其子树的所有节点,即最大堆(最小堆)。堆结构的构建采用数组表示,与之前的二叉树的线性存储结构类似,主要成员函数包括插入、删除根节点等函数。插入数值时直接在数组的尾端增加元素,从尾端开始往上迭代判断是否满足堆的有序性条件。删除根节点函数,将根节点关键字返回,同时将数组的最后一个元素置于根节点,从根节点开始往下迭代判断是否都满足有序性条件,具体来说从左右儿子中选择比较大的一个和该值比较,不满足条件时就交换。在学习完二叉搜索树和平衡二叉树之后,堆就显得异常简单了。

//maxheap.h#ifndef MAXHEAP_H#define MAXHEAP_H#include <IOSTREAM>template<class Type>class MaxHeap{private:Type* Data;int Size;int Capacity;public:MaxHeap():Size(0),Capacity(100){Data=new Type[Capacity];Data[0]=Capacity;}~MaxHeap(){}bool Insert(Type);Type DeleteMax();bool IsFull(){return Size==Capacity-1;}bool IsEmpty(){return Size==0;}void Print();};template<class Type>bool MaxHeap<Type>::Insert(Type x){if(IsFull())return false;for(int i=++Size;i>1&&Data[i/2]<x;i/=2){Data[i]=Data[i/2];}Data[i]=x;return true;}template<class Type>Type MaxHeap<Type>::DeleteMax(){if(IsEmpty())return Type(-1111);Type temp=Data[1];Type last=Data[Size--];int parent,child;for(parent=1;2*parent<=Size;parent=child){child=parent*2;if(2*parent+1<=Size&&Data[2*parent]<Data[2*parent+1])child++;if(last<Data[child])Data[parent]=Data[child];elsebreak;}Data[parent]=last;return temp;}template<class Type>void MaxHeap<Type>::Print(){for(int i=1;i<=Size;i++){std::cout<<Data[i]<<" ";}std::cout<<std::endl;}#endif

1 0
原创粉丝点击