关于堆的一点总结

来源:互联网 发布:linux查看电池电量 编辑:程序博客网 时间:2024/06/15 04:51

一、什么是堆

堆是一颗被完全填满的二叉树,可能的例外是在底层,底层上的元素从左到右填入,这样的树被称为完全二叉树。


二、堆的特性

1、如果一个堆有N个节点,那么堆的高度为 h = [lgN] 。即N 在 2到 2h+1-1  之间。

2、父节点的值大于(大顶堆)或小于(小顶堆)子节点的值。


三、堆支持的操作

1、上浮 shiftup
2、下沉 shiftdown
3、插入 push
4、弹出 pop
5、取顶 top

其中,当前元素若可能与下一层元素交换,就是siftdown;若可能与上一层元素交换,就是siftup。或者说当前元素被“挖出”后形成的“坑”,若往上升就是siftup,若往下降就是siftdown。当你插入了某个节点或弹出了节点时,为了恢复堆的性质,就可能要执行这两种操作。


四、堆的表示

堆可以用数组来表示。若从下标0开始存放元素的话,那么对于数组任一位置 i上的元素,其左儿子在位置2i+1上,右儿子在2i+2上,它的父亲则在[(i-1)/2]上。

对于一个数组a,可以通过这种方式把它转换为堆:就是对下标为[a.length/2]-1一直到0为止 的位置(实际上也就是成为父节点的位置)执行上面所说的“下沉” 操作。


参考:

1、http://www.cnblogs.com/JVxie/p/4859889.html

2、http://blog.csdn.net/ditian1027/article/details/19987239

3、http://blog.csdn.net/zhutulang/article/details/7746033

原创粉丝点击