Linux后台服务器编程。
分类: C/C++
2014-07-26 20:48:19
首先什么是小根堆:
(1)它是一颗完全二叉树
(2)任意一个节点均小于或等于其左右子节点的关键码(大根堆相反就是了)
因此可以得知,当前树形结构的根节点就是当前整个树形结构最小的节点。。。
至于说这种堆结构有什么作用:
(1)以前本科的时候上数据结构课的时候就有讲过堆排序,好像还不错,O(nlogn)的复杂度
(2)可以用来构造优先权队列。。。。
(3)在libevent库中,定时是采用小根堆来维护(nginx是红黑树)
好了,下面来看看小根堆的插入和删除吧,其实感觉 非常简单诶,比红黑树简单,只需要向上向下浮动就好了,没有红黑树那种左旋右旋,还得染色什么的。。
首先来看节点的插入:
(1)将要插入的节点按照完全二叉树的形式插入到当前树形结构的最末尾
(2)对这个刚刚插入的节点进行向上浮动,浮动的原理是:比较当前的节点和其父节点,如果比父节点小,那么与父节点交换,然后递归的进行,直到浮动不动了或者到了根节点
接下来来看节点的删除:
(1)小根堆的删除是删除当前的根节点,也就是返回当前根节点的值,然后用当前树形结构的最后一个节点来代替根节点
(2)从当前属性结构的最后一个非叶节点开始,向下浮动,浮动的原理是:
如果有比自己小的子节点,那么与这个子节点交换,然后递归的对刚刚交换下去的子节点进行向下浮动,(如果当前两个子节点都比自己小,那么就与最小的那个交换)