c 数据结构,二叉树DS5-Binar Tree(new).pptVIP

  • 3
  • 0
  • 约2.14万字
  • 约 91页
  • 2018-10-04 发布于浙江
  • 举报
* * 5.6 堆(Heap) 一、堆的定义 1、什么是堆? ◆若有n个关键字的集合K={k0,k1,k2, …,kn-1}将其所有元素按完全二叉树的顺序存贮方式存于一个一维数组中,并且满足以下条件,则该集合称为最小堆(或最大堆)。 ki≤k2i+1和ki≤k2i+2 或 ki≥k2i+1和ki≥k2i+2 (其中,i = 0,1, …?(n – 2) / 2? ) ◆举例 09 17 65 23 45 78 87 53 31 0 1 2 3 4 5 6 7 8 最小堆 87 78 53 45 65 09 31 17 23 0 1 2 3 4 5 6 7 8 最大堆 09 17 65 23 45 78 87 53 31 0 1 2 3 4 5 6 7 8 堆顶元素值最小 87 78 53 45 65 09 31 17 23 0 1 2 3 4 5 6 7 8 堆顶元素值最大 * 2、最小堆的类声明 template class Elem,class Comp class MinHeap { private : Elem * heap; //存放堆元素的数组 int n; //堆当前元素个数 int size; //堆最多允许元素个数 void siftdown (int i) public : MinHeap (Elem* h, int num ,int max) //构造堆 {Heap=h; n=num; size=max; buildHeap();} int heapsize() const {return n;} ~MinHeap( ) {delete [ ] heap;} * bool Insert (const Elem ); bool RemoveMin (Elem ); bool isLeaf(int pos) const{return (pos=n/2)(posn)} int leftchild(int pos) const {return pos*2+1;} int rightchild(int pos) const {return pos*2+2;} int parent(int pos) const{return (pos-1)/2;} bool remove(int, Elem); void buildHeap() { for(int i=n/2-1; i=0; i--) siftdown(i); } }; * 二、堆的建立 1、自下向上逐步调整建堆的举例 i j 53 17 78 09 45 87 65 23 31 0 1 2 3 4 5 6 7 8 i = ?(n – 2) / 2? = 3 * i j 53 17 78 09 45 87 65 23 31 0 1 2 3 4 5 6 7 8 i = 2 二、堆的建立 1、自下向上逐步调整建堆的举例 65 78 * i j 53 17 65 09 45 87 78 23 31 0 1 2 3 4 5 6 7 8 i = 1 二、堆的建立 1、自下向上逐步调整建堆的举例 09 17 i j * i j i j 二、堆的建立 1、自下向上逐步调整建堆的举例 i j 53 09 65 17 45 87 78 23 31 0 1 2 3 4 5 6 7 8 i = 0 09 53 17 53 23 53 ☆对第i个关键字进行筛选的要点: ①在第(2 i + 1)和(2 i + 2)中选小者定为第j ②若第i大于第j则交换 ③向下继续:i = j,j = 2 i + 1,重复①、②,直到j>(n – 1) * 向下筛选的算法 template class Elem,class Comp void MinHeapElem,Comp ::siftDown(int pos) { while(!isLeaf(pos)){ int j=leftchild(pos); int rc=rightchild(pos); if(rcn)Comp::gt(Heap[j],Heap[rc])) j=rc; if(!Comp::gt(Heap[pos],Heap[j])) return; swap(Heap, pos, j); pos=j; } } *

文档评论(0)

1亿VIP精品文档

相关文档