第三节堆及其应用一、预备知识完全二叉树:如果一棵深度为K二叉树,1至k-1层的结点都是满的,即满足2i-1,只有最下面的一层的结点数小于2i-1,并且最下面一层的结点都集中在该层最左边的若干位置,则此二叉树称为完全二叉树
二、堆的定义堆结构是一种数组对象,它可以被视为一棵完全二叉树
树中每个结点与数组中存放该结点中值的那个元素相对应,如下图:三、堆的性质设数组A的长度为len,二叉树的结点个数为size,size≤len,则A[i]存储二叉树中编号为i的结点值(1≤i≤size),而A[size]以后的元素并不属于相应的堆,树的根为A[1],并且利用完全二叉树的性质,我们很容易求第i个结点的父结点(parent(i))、左孩子结点(left(i))、右孩子结点(right(i))的下标了,分别为:i/2、2i、2i+1;更重要的是,堆具有这样一个性质,对除根以外的每个结点i,A[parent(i)]≥A[i]
即除根结点以外,所有结点的值都不得超过其父结点的值,这样就推出,堆中的最大元素存放在根结点中,且每一结点的子树中的结点值都小于等于该结点的值,这种堆又称为“大根堆”;反之,对除根以外的每个结点i,A[parent(i)]≤A[i]的堆,称为“小根堆”
四、堆的操作用堆的关键部分是两个操作:put操作,即往堆中加入一个元素;get操作,即从堆中取出并删除一个元素
1、往堆中加入一个元素的算法(put)如下:(1)在堆尾加入一个元素,并把这个结点置为当前结点
(2)比较当前结点和它父结点的大小如果当前结点小于父结点,则交换它们的值,并把父结点置为当前结点
如果当前结点大于等于父结点,则转(3)
重复n次put操作,即可建立一个小根堆
我们举一个例子看看具体过程:设n=10,10堆的数量分别为:3517642541
设一个堆结构heap[11],现