1.基本概念
1.1 满二叉树
- 满二叉树是指的是除了最后一层外,其他节点都有两个孩子,而最后一层都是叶子节点。
1.2 完全二叉树
满二叉树是完全二叉树,但完全二叉树不要去最后一层是满的,完全二叉树要求所有节点从左到右连续,中间不能为空。
- 完全二叉树 特征 ,给定任何一个节点,可以根据其编号,计算出其父节点和孩子节点的编号
比如:如果编号为 i则父节点为i/2 左节点为2i 又节点为2i+1
它使得逻辑上的二叉树可以存储到数组中- 扩展排序二叉树 是完全有序的,每个节点都有确定的前驱和后继,而且不能有重复的元素。与排序二叉树不同,在堆中可以有重复发元素,元素间不是完全有序的,但对父子之间,有一定的顺序要求 按照顺分为两种堆,一种是最大堆,一种是最小堆。
1.3 最大堆和最小堆
最大堆指的是每个节点都不大于其父节点。这样每个父节点,一定不小于其所孩子节点。树的根是最大的节点,对于每个子树,子树的根是最大的节点。最小堆正好相反。
堆的增删(以最小堆为例)
- 添加元素 : (1) 添加元素到最后的位置
(2)与父节点比较,若果大于父节点,则满足性质,结束。否则(向上调整)在于父节点比较和交换,直到父节点为空,或者大于等于父节点。- 从头部删除元素:在队列中一般是从 ,从头部删除元素,java 中用堆实现优先队列。
步骤:(1)用最后一个元素替换头部的元素,并且删除掉最后一个元素;
(2)将新的头部和两个孩子节点中较小的比较,如果不大于该节点,则满足堆的性质,结束,否则与较小的孩子节点进行交换,交换后,在于较小的孩子节点比较和交换,一直没有孩子节点,或者不大于两个孩子节点。这个过程叫做 向下调整。- 从中间删除元素
与从头部删除元素医药,都是先用最后一个元素替换待删除的元素。不过替换后,有两种情况,如果该元素大于某孩子节点,则需要向下调整,如果小于小于父节点,则需要向上调整。- 构建初始堆
给定一个无序的数组,将其转换为最小堆的过程称为 heapify.基本思路是,从最后一个非叶子节点开始,一直往前到根,每个节点执行向下调整。
//逻辑代码
void heapify(){
for(int i=size/2;i>=1;i--){
siftdown()//向下调整
}
}
- 查找和遍历
在堆中进行查找没有特殊的算法,就是从数组的头找到尾,效率为O(N)