#ifndef MAXHEAP_H_
#define MAXHEAP_H_
template<class T>
class MaxHeap
{
public:
MaxHeap(int mx = 10);
virtual ~MaxHeap();
bool IsEmpty();
void Push(const T&);
void Pop();
const T& Top() const; // Top就是查看根结点,
private:
T* heapArray;
int maxSize;
int currentSize;
void trickleUp(int index);
void trickleDown(int index); // 向下渗透,
};
template<class T>
MaxHeap<T>::MaxHeap(int mx = 10)
{
if(mx < 1) throw "max size must >= 1. ";
maxSize = mx;
currentSize = 0;
heapArray = new T[maxSize];
}
template<class T>
MaxHeap<T>::~MaxHeap()
{
delete [] heapArray;
}
template<class T>
bool MaxHeap<T>::IsEmpty()
{
return currentSize == 0; // currentSize是用来计数的,
}
template<class T>
void MaxHeap<T>::Push(const T& e)
{
if(currentSize == maxSize) throw "MaxHeap is full.";
heapArray[currentSize] = e;
trickleUp(currentSize++); // 表示向上渗透,
}
template<class T>
void MaxHeap<T>::trickleUp(int index)
{
int parent = (index - 1)/2;
T bottom = heapArray[index];
while(index > 0 && heapArray[parent] < bottom)
{
heapArray[index] = heapArray[parent];
index = parent;
parent = (parent - 1) / 2;
}
heapArray[index] = bottom;
}
template<class T>
const T& MaxHeap<T>::Top() const
{
return heapArray[0];
}
template<class T>
void MaxHeap<T>::Pop()
{
heapArray[0] = heapArray[--currentSize];//currentSize 是代表的最后边的空位,将其-- 就是最后那个数的位置,
trickleDown(0); // 向下渗透,
}
template<class T>
void MaxHeap<T>::trickleDown(int index)
{
int largerChild;
T top = heapArray[index];
while(index < currentSize / 2) // 查找到最后一行的上一行,
{
int leftChild = 2 * index + 1; // leftChild 是下标,
int rightChild = leftChild + 1; // rightChild是下标,
if(rightChild < currentSize && heapArray[leftChild] < heapArray[rightChild])
largerChild = rightChild;
else
largerChild = leftChild;
if(top >= heapArray[largerChild])
break;
heapArray[index] = heapArray[largerChild];
index = largerChild;
}
heapArray[index] = top;
}
#endif
#include <iostream>
#include "MaxHeap.h"
using namespace std;
int main()
{
MaxHeap<int> h(100);
cout << h.IsEmpty() << endl;
cout << endl;
h.Push(31);
h.Push(12);
h.Push(6);
h.Push(3);
cout << h.Top() << endl; // 输出的是最大的说,根结点,31 Top就是读取堆顶的数据,
h.Push(100);
h.Push(50);
cout << h.Top() << endl; // 输出是100,
h.Pop();
cout << h.Top() << endl; // 输出的是50,
h.Pop();
cout << h.Top() << endl;
return 0;
}