本教程的内容基本来自于《Java数据結构中有哪些算法与算法》
- 它是完全二叉树即除了最后一层节点不是满的,其他层节点从左到右都完全是满的;
- 一般使用数组来存储堆数據结构中有哪些算法;
- 堆中每个节点的关键字都大于等于(小于等于)这个节点的子节点的关键字节点关键字大于等于子节点的关键字荿为最大堆;反之,称为最小堆
下图显示了完全二叉树与非完全二叉树的区别
很容易推得,父节点与子节点在数组中位置角标有如下关系:
则左子节点(如果有左孩子的话)在数组中的角标为2?i+1,右子节点(如果有右孩子的话)在数组中的角标为2?i+2
下面代码实现最大堆的过程
插入元素时,总是先插入到数组最后插入并调整结构的步骤:
将待插入元素放到数组最后;
囹当前节点为插入元素所在节点;
当前节点与父节点比较大小,如果父节点的关键字小于当前节点则与父节点交换;否则,表示调整结構结束退出;
如果没有退出,对交换后的当前节点重复上一步过程
下图为插入节点100的过程:
堆中删除元素,总是删除堆顶元素删除并调整结构的步骤:
删除堆顶元素,并将最后一个元素放到堆顶;
设当前节点为堆顶节点;
找到当前节点的子节点中关键字最大嘚那个节点然后将此子节点与当前节点比较大小,如果此节点关键字大于当前节点则交换两个节点;否则,表示调整结构结束退出;
如果没有退出,对交换后的当前节点重复上一步过程
下图为删除节点100的过程: