一.想搞懂堆结构首先得了解什么是完全二叉树
两句话,中间一定是满节点,最后一层要么是满的,要么从左到右是一个变满的状态。
二.堆
1.堆是一个完全二叉树
2.谈堆只有大根堆和小根堆
什么意思?比如大根堆,每个节点在以它为顶点的树中是最大的。
三.关于完全二叉树的一些公式
如果索引从0开始,那么对于任意一个i,它的左孩子是2i+1,它的右孩子是2i+2,它的父亲是(i-1)/2
四.关于堆的常见算法
1.比如每次给你一个树让你将这数组成一个大根堆
思路:每加一个数,把这个数和其父节点pk,谁大谁上,一直持续此过程到根节点
2.比如让你返回堆中最大的值,然后删除这个值,让其他元素依然是一个大根堆
思路:先记录第一个位置的数(大根堆),然后将最后一个位置的元素替换到第一个位置,然后分别看该值的左右两个孩子,谁大和谁交换,一直持续此过程直到自己没有左右孩子
3.堆排序
将一堆数组成一个堆结构,依次弹出最大/最小的数即可。