堆的储存:
数组 因为堆本身是完全二叉树。
堆的种类:
最大堆与最小堆
以最大堆为例:
结构特点:
1.为完全二叉树结构
2.父节点恒大于子节点
3.从根节点到各个叶节点的路径上的序列都是从大到小
操作:
1.插入insert()
插入在数组的尾端,然后根据大根堆的特点,向上寻找自己的位置
2.删除delete()
因为大根堆是针对与一些具体的情况而产生的特殊情况,所以删除操作对象是最大值的
思路:用最后Tn的元素的值作为根节点T0的值,来将根节点覆盖(在实际编写函数时,我们需要返回所删除的最大值),当然这样的树,肯定不是大根堆,根节点需要是最大值,而在删除了最大值后的两个大值就是根节点的左右孩子,所以根节点,左孩子,右孩子中最大值,做根节点,然后Tn就会下移作为一个孩子,而子树同样需为大根堆,则同样的思路来判断T0的位置。
3.创建大根堆create()
由数组连续接收元素,显然接收完后的数组所形成的数组,并不满足大根堆。
思路:在删除操作中,在以最后的元素作为根节点时,我们通过不断与左右孩子中做根节点来实现将最后的元素放到合适的位置的。我们在接收数据后,所要做的也是调整位置。而删除中这样思路的成立的前提条件是根节点的两左右子树都是大根堆。刚接受数据的数组不一定满足这样的先决条件,但我们知道由叶节点作为孩子的节点的组合中叶节点一定是大根堆,如87(9,null),30(72,49)。。。可以先从这样的最小子树开始满足大根堆,然后再往上,使两个满足大根堆的子树与共同的父节点组成的树满足大根堆,直至走到整棵树。
从小部分走到大部分,从小树开始调整满足大根堆,然后再走向大部分满足大根堆。