数据结构二叉树,数据结构与算法(3)——二叉堆


#include using namespace std; const int HEAP_SIZE = 100; void sink(int fa); void swim(int son); int heap[HEAP_SIZE+1]; int hs; //以建立最小堆为例 /*****************************************************************/ //删除堆顶元素 ,利用上游函数调整 /* 删除最小值(deleteMin) 先用最后一个元素代替根 由于这一步会导致根的元素比儿子大,因此需要向下调整。向下调整的方法很简 单,就是把根和较小儿子做比较,如果根比较大,则交换它和儿子,算 法好比石沉大海,因此有的书把它称为sink过程 */ int deleteMin(){ int value = heap[1]; //把堆尾元素前置,再sink()调整 heap[1]=heap[hs--]; sink(1); cout<>1,a = heap[son]; while(fa&&heap[son]>1; } heap[son] = a; } /*****************************************************************/ //初始建立一个堆 /* 给hs个整数,如何构造一个二叉堆?可以一个一个插入,但是有更好 的方法:从下往上一层一层向下调整。由于叶子无需调整,因此只需 要从[hs/2] 开始递减到1。 */ void build(){ for(int i=hs/2;i>=1;i--) sink(i); } int main(){ cin>>hs; for(int i=1;i<=hs;i++) cin>>heap[i]; build(); cout<<"删除最小元素:"< 二叉堆(binary heap) 是一个高级数据结构,它的思想简单,代码短,然而用处非常大。二叉堆一般被用来实现优先队列(priority queue)
优先队列经常被用来实现贪心算法和离散时间模拟系统,是一个基础数据结构。STL专门提供了priority queue 容器适配器,读者可以在学习本节后比较它和自己的二叉堆实现法的效率。二叉堆是一棵完全二叉树,即所有叶子在同一层,且集中在左边。二叉堆满足堆性质(heap property) :根的值在整棵树中是最小的。不仅如此,根的两棵树分别构成堆。用heap 数组来表示各个元素,则根是heap[1] ,最后一个元素是heap[n] ( heap[0]不使用)。
k 的左儿子是2k ,右儿子是2k + 1 ,父亲是bk=2c 。
Tags:  二叉树的算法 平衡二叉树算法 二叉树算法 二叉树遍历算法 数据结构二叉树

延伸阅读

最新评论

发表评论