堆
堆是一种有如下特点的二叉树
1. 堆是完全二叉树;
- 完美二叉树: 一个深度为k(>=-1)且有2^(k+1) - 1个结点的二叉树称为完美二叉树;
- 完全二叉树: 从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐;
- 完满二叉树: 所有非叶子结点的度都是2(只要你有孩子,你就必然是有两个孩子);
2. 堆常常用一个数组实现;
3. 堆的每个节点的关键字都>=这个节点的子节点的关键字(假设最大的关键字在根节点上,即降序的优先级队列);
基于堆实现的优先级队列插入删除的效率都是O(logN);
堆是弱序的:与二叉搜索树相比,堆是弱序的,二叉搜索树中所有节点的左子孙节点的关键字都小于右子孙节点的关键字, 而堆只要求沿着从根到叶子的每一条路径,节点都是有序的;
移除: 删除关键字最大的节点,即根节点;
堆的实现
1. 堆的节点类
2. 堆的实现类
由于堆的特性:
1. 完全二叉树;
2. 只要求沿着从根到叶子的每一条路径,节点都是有序的;
所以这里用数组实现堆,而不是之前实现二叉树时那样用引用,其结构如下:{A ,A1,A2, A11,A12,A21,A22,A111,A112,A121,A122,A211,A212,A221,A222,...} 每层节点最多个数依次为: 1,2,4,8,16,...
注: 这里没有对数组进行扩展的操作, 之前在HashTable中已经有过相关的实现;另外, 也可以用Vector代替数组,Vector 是可以自动扩展的,详见下面的VectorHeap:
3. 堆的测试
4. 利用上面的堆可以实现一种排序算法----堆排序
5. 堆排序的测试
我是今阳,如果想要进阶和了解更多的干货,欢迎关注公众号”今阳说“接收我的最新文章