看面经的时候看到了特么要手动实现最大堆和最小堆。我就赶紧上网搜了搜,发现这篇特别好。这里转载一下:http://www.cnblogs.com/skywang12345/p/3610187.html
以最大堆为例,最大堆的特点为
[性质一] 堆中任意节点的值总是不小于其子节点的值;
[性质二] 堆总是一棵完全树。
下面是例子,因为是完全树,所以堆完全可以由数组来表示
(01) 索引为i的左孩子的索引是 (2*i+1);
(02) 索引为i的左孩子的索引是 (2*i+2);
(03) 索引为i的父结点的索引是 floor((i-1)/2);
下面用图片简单描述一下最大堆的插入和删除。
插入:
就是先把插入节点放在最后,然后一步步和父节点比较,如果顺序不对就swap。
删除:
先把root删了,删完之后把最后一个挪上来,然后再一步步比较的swap。