赞
踩
栈(数据结构):一种先进后出的数据结构。
http://blog.csdn.net/genios/article/details/8157031
最大堆和最小堆是二叉堆的两种形式。
最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大。
最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小。
最小堆和最大堆的增删改相似,其实就是把算法中的大于改为小于,把小于改为大于。
生成最大堆:最大堆通常都是一棵完全二叉树,因此我们使用数组的形式来存储最大堆的值,从1号单元开始存储,因此父结点跟子结点的关系就是两倍的关系。
即:heap[father * 2] = heap[leftChild]; heap[father * 2 + 1] = heap[rightChild];
最大堆的初始化
在生成最大堆时,我们可以采取一次次遍历整棵树找到最大的结点放到相应的位置中。
但是这种方法有个不好的地方,就是每个结点都要重复比较多次。
所以我们可以换一种思考的顺序,从下往上进行比较。先找到最后一个有子结点的结点,先让他的两个子结点进行比较,找到大的值再和父结点的值进行比较。如果父结点的
值小,则子结点和父结点进行交换,交换之后再往下比较。然后一步步递归上去,知道所在结点的位置是0号位置跳出。这样就可以有效地减少比较所用到的时间。
但是每一次交换都要重复三步:heap[i] = temp; heap[i] = heap[j]; heap[j] = temp;
当树的结构比较大的时候,就会浪费很多时间。
所以我们可以先把父结点的值存到temp中跟子结点比较,如果子结点大的话就把子结点的值赋值给父结点,再往下比较,最后才把temp的值存到相应的位置。
最大堆的插入
最大堆的插入的思想就是先在最后的结点添加一个元素,然后沿着树上升。跟最大堆的初始化大致相同。
最大堆的删除,即删除最大的元素。我们先取最后的元素提到根结点,然后删除最大值,然后再把新的根节点放到合适的位置
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。