代码都有详细的注解!!!!!!!!!!!!
主要用于动态数据的维护
二叉堆又分为最大堆个最小堆
最大堆:必须是一个完全二叉树,堆中的节点不大于其父节点的值。
完全二叉树:
- 除了最后一层节点的个数以外,其它层节点的个数必须是最大值(满的)。
- 最后一层的节点数虽然可以不是最大数,但必须全部靠左。
#include <iostream>
#include <algorithm>
using namespace std;
/*
当容量不足时记得开辟新的空间(以下代码没写)
*/
template<typename Item>
class MaxHeap{
private:
Item* data;
int count;
/*与父节点进行比较,如果父节点小于当前节点,则交换父子节点,直到父节点不小于子节点*/
void shiftUp(int k){
while(k > 1 && data[k/2] < data[k]){//k位置的父节点 是不是比data[k]还要小
swap(data[k/2], data[k]);
k / = 2;
}
}
/*堆顶元素出堆,用最后一个元素放到堆顶的位置,然后向下shiftDown,比叫两个子节点的值,跟大的值交换*/
void shiftDown(int k){
while(2*k <= count){//判断是否有左孩子 来确定当前k节点是否有孩子