二叉堆的建立
来源:互联网 发布:feel软件 编辑:程序博客网 时间:2024/06/09 17:54
堆是一棵具有特殊性质的二叉树,堆的基本性质是堆中所有结点的值必须大于或者等于(或小于等于)其孩子结点的值。这也称为堆的性质。堆可以分为最大堆和最小堆,如果要求结点的值必须大于其孩子结点的值,则称其为最大堆,反之,则称其为最小堆。
堆在形式上表现为一棵完全二叉树。这里,使用数组来建立一个最大堆:假定下标从0开始,所有元素都保存在数组中
public class Heap {public int[] array; public int count; //堆中元素的个数public int capacity; //堆的大小public int heap_type; //最小堆或最大堆public Heap(int capacity, int heaptype){this.capacity = capacity;this.heap_type = heaptype;this.count = 0;this.array = new int[capacity];}public int Parent(int i){//通过数组位置的规律得到if(i<=0 || i>this.count)return -1;return (i-1)/2;}public void Print(){for(int i=0;i<this.count;i++)System.out.print(this.array[i]+" ");}//左右孩子public int LeftChild(int i){int left = 2*i+1;if(left>=this.count)return -1;elsereturn left;}public int RightChild(int i){int right = 2*i+2;if(right>=this.count)return -1;return right;}public int GetMaximum(){if(this.count==0)return -1;return this.array[0];}//堆化当前元素public void PercolateDown(int i){int l,r,max,temp;l = LeftChild(i);r= RightChild(i);if (l==-1 && r ==-1)return;if(l != -1 && this.array[l]>this.array[i] )max = l;elsemax = i;if(r!=-1&&this.array[r]>this.array[max])max = r;if(max!=i){temp = this.array[i];this.array[i] = this.array[max];this.array[max] = temp;PercolateDown(max);}}//删除元素public int DeleteMax(){if(this.count==0)return -1;int data = this.array[0];this.array[0] = this.array[this.count-1];this.count--;PercolateDown(0);return data;}//插入元素public int Insert(int data){int i;if(this.count == this.capacity)ResizeHeap();this.count++;i = this.count-1; if(i==0){ this.array[0] = data; return i; } while(i>0 && data> this.array[(i-1)/2]){this.array[i] = this.array[(i-1)/2];i=(i-1)/2;}this.array[i] = data;return i;}//扩展堆public void ResizeHeap(){int[] array_old = new int[this.capacity];System.arraycopy(this.array, 0, array_old, 0,this.count-1);this.array = new int[this.capacity*2];if(this.array==null){System.out.println("Memory error");return;}for(int i=0;i<this.capacity;i++)this.array[i] = array_old[i];this.capacity*=2;array_old = null;}//清空堆public void DestroyHeap(){this.count = 0;this.array = null;}//数组建堆,取n个输入元素将它们插入空堆中public void BuildHeap(Heap h,int[] A,int n){if(h==null)return;while(n > this.capacity)h.ResizeHeap();for(int i=0;i<n;i++)h.array[i] = A[i];this.count = n;int max = n-1;for(int i=(max-1)/2;i>=0;i--)h.PercolateDown(i);}}
0 0
- 二叉堆的建立
- 最大二叉堆的建立以及最大堆排序
- 堆和二叉查找树的建立的时间复杂度
- 堆的建立&堆排序
- 用线性时间算法建立二叉堆。
- [算法导论笔记]建立二叉堆
- 最大堆的建立
- 最小堆的建立
- 堆的建立
- 堆(Heap)的建立
- 大小堆的建立
- 最小堆的建立
- 【数据结构】堆的建立
- 二叉堆的实现
- 二叉堆的实现
- 二叉堆的实现
- 二叉堆的实现
- 数据结构基础 之 深入理解二叉堆建立的时空复杂
- 浏览器图标设置
- Cannot call method 'getItem' of null
- git https请求 提示error setting certificate verify locations
- Android Studio快捷键
- 爬虫历史简析
- 二叉堆的建立
- 局域网络访问问题及电脑控制手机显示
- 欢迎使用CSDN-markdown编辑器
- Linux各个目录的详解
- C++ 递归程序
- 关于MYSQL Innodb 锁行还是锁表
- 第八届蓝桥杯 k倍区间(前缀和)
- 【开发利器】中国国内可用API合集
- Windows7+VS2013+Anaconda2-4.3.1(Python2.7)+OpenCV2.4.10-Caffe框架搭建(无GPU)