二叉堆的构建(Java)

 1 package com.rao.linkList;
 2
 3 /**
 4  * @author Srao
 5  * @className BinaryHeap
 6  * @date 2019/12/3 14:14
 7  * @package com.rao.linkList
 8  * @Description 二叉堆
 9  */
10 public class BinaryHeap {
11
12     /**
13      * 在插入一个节点之后,数组进行上浮
14      * @param arr:左孩子等于n*2+1,右孩子等于n*2+2
15      * @param length:表示数组的长度
16      */
17     public int[] upAdjust(int[] arr, int length){
18         //代表新插入的节点的下标
19         int child = length - 1;
20
21         //求出父节点的下标
22         int parent = (child-1)/2;
23
24         //获得插入的节点
25         int temp = arr[child];
26
27         //与父节点进行比较,如果父节点大于子节点,就把父节点赋值给子节点,然后把子节点指向父节点
28         while (child > 0 && arr[parent] > temp){
29             arr[child] = arr[parent];
30             child = parent;
31             //无论时左孩子还是右孩子,求父节点都是用这个公式
32             parent = (child-1)/2;
33         }
34
35         //如果父节点比子节点要小,此时arr[parent] < temp
36         arr[child] = temp;
37         return arr;
38     }
39
40     /**
41      * 在二叉堆当中,一般是删除根元素,在删除根元素之后,把最后一个元素当作根元素,然后进行下沉
42      * @param arr
43      * @param parent:被当作根元素的节点,从这个元素开始下沉
44      * @param length:数组的长度
45      * @return
46      */
47     public int[] downAdjust(int[] arr, int parent, int length){
48         //获取临时的根节点
49         int temp = arr[parent];
50
51         //计算左孩子节点
52         int child = parent*2+1;
53
54         //进行下沉操作
55         while (child < length){
56             //先对比左右孩子的大小,用小的那一个进行操作
57             if (child+1 < length && arr[child+1] < arr[child]){
58                 child++;
59             }
60             //如果父节点比子节点小,就直接退出
61             if (temp <= arr[child]){
62                 break;
63             }else {//如果父节点比子节点大,就把子节点赋值给父节点
64                 arr[parent] = arr[child];
65                 //让父节点指针指向子节点
66                 parent = child;
67                 child = parent*2+1;
68             }
69         }
70         arr[parent] = temp;
71         return arr;
72     }
73
74     /**
75      * 根据数组构建一个二叉堆
76      * @param arr:数组
77      * @param length:数组长度
78      * @return 不能从二叉堆的第一个元素开始下沉,要用二叉堆的最后一个非叶子节点开始下沉
79      * 如果从二叉堆的根节点开始下沉,那么可能最上面的三个元素时二叉堆,但是下面的元素还是乱的
80      */
81     public int[] bulidHeap(int[] arr, int length){
82         for (int i = (length-1)/2; i>=0; i--){
83             downAdjust(arr, i, length);
84         }
85         return arr;
86     }
87
88 }

https://www.cnblogs.com/skywang12345/p/3610187.html

上面的博客中有比较好的图,可以参考一下,按着那个图我用Java实现了一下,注释也写的比较全面

原文地址:https://www.cnblogs.com/rao11/p/11976960.html

时间: 2024-08-10 21:14:27

二叉堆的构建(Java)的相关文章

纯数据结构Java实现(6/11)(二叉堆&amp;优先队列)

堆其实也是树结构(或者说基于树结构),一般可以用堆实现优先队列. 二叉堆 堆可以用于实现其他高层数据结构,比如优先队列 而要实现一个堆,可以借助二叉树,其实现称为: 二叉堆 (使用二叉树表示的堆). 但是二叉堆,需要满足一些特殊性质: 其一.二叉堆一定是一棵完全二叉树 (完全二叉树可以用数组表示,见下面) 完全二叉树缺失的部分一定是在右下方.(每层一定是从左到右的顺序优先存放) 完全二叉树的结构,可以简单理解成按层安放元素的.(所以数组是不错的底层实现) 其二.父节点一定比子节点大 (针对大顶堆

打印二叉堆(Java实现)

打印二叉堆:利用层级关系 我这里是先将堆排序,然后在sort里执行了打印堆的方法printAsTree() public class MaxHeap<T extends Comparable<? super T>> { private T[] data; private int size; private int capacity; public MaxHeap(int capacity) { this.capacity = capacity; this.size = 0; thi

堆、二叉堆、堆排序

堆.二叉堆.堆排序 堆的概念: n个元素序列 { k1, k2, k3, k4, k5, k6 -. kn } 当且仅当满足以下关系时才会被称为堆: ki <= k2i,ki <= k2i+1 或者 ki >= k2i,ki >= k2i+1 (i = 1,2,3,4 .. n/2) 如果数组的下表是从0开始,那么需要满足 ki <= k2i+1,ki <= k2i+2 或者 ki >= k2i+1,ki >= k2i+2 (i = 0,1,2,3 .. n

数据结构 二叉堆 &amp; 堆排序

二叉堆,是一个满二叉树,满足堆的性质.即父节点大于等于子节点(max heap)或者是父节点小于等于子节点(min heap).二叉堆的如上性质常用于优先队列(priority queue)或是用于堆排序. 由于max heap 与min heap类似,下文只针对min heap进行讨论和实现. 如上图,是根据字母的ASCII码建立的最小堆. 我们用数组对满二叉树采用宽度优先遍历存储堆结构,如下图所示: 从数组下标1开始存储堆,这样的处理方式可以得到如下性质: 1.堆中的每个父节点k,他的两个子

Bestcoder4——Happy Three Friends(二叉堆)

本文出自:http://blog.csdn.net/svitter Happy Three Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description Dong-hao , Grandpa Shawn , Beautful-leg

笔试算法题(46):简介 - 二叉堆 &amp; 二项树 &amp; 二项堆 &amp; 斐波那契堆

二叉堆(Binary Heap) 二叉堆是完全二叉树(或者近似完全二叉树):其满足堆的特性:父节点的值>=(<=)任何一个子节点的键值,并且每个左子树或者右子树都是一 个二叉堆(最小堆或者最大堆):一般使用数组构建二叉堆,对于array[i]而言,其左子节点为array[2*i],其右子节点为 array[2*i+1]:二叉堆支持插入,删除,查找最大(最小)键值的操作,但是合并二叉堆的复杂度较高,时间复杂度为O(N):但是二项堆或者斐波 那契堆则仅需要O(logN): 二项树(Binomial

python 二叉堆

BinaryHeap() 创建一个新的,空的二叉堆. insert(k) 向堆添加一个新项. findMin() 返回具有最小键值的项,并将项留在堆中. delMin() 返回具有最小键值的项,从堆中删除该项. 如果堆是空的,isEmpty() 返回 true,否则返回 false. size() 返回堆中的项数. buildHeap(list) 从键列表构建一个新的堆. from pythonds.trees.binheap import BinHeap bh = BinHeap() bh.i

普林斯顿公开课 算法4-2:二叉堆

二叉树 介绍二叉堆之前首先介绍二叉树.二叉树有一个根节点,节点下又有两个子节点.完全二叉树是指一个二叉树树除了最底层,其他层都是完全平衡的. 完全二叉树最基本的性质就是它的高度是 floor(lgN). 二叉堆 二叉堆是完全二叉树的一种,每个节点对应一个数值,而且这个数值都大于等于它子节点的数值. 下图是一个二叉堆. 二叉堆的储存 由于二叉堆是完全二叉树,所以它可以用一个数组进行储存.所以不需要创建节点对象,再建立节点之间的连接.这样节省了很多开销. 用数组a[]表示一个二叉堆有以下特性: a[

《Algorithms算法》笔记:优先队列(2)——二叉堆

二叉堆 1 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级存储(不用数组的第一个位置) 2 二叉堆的性质 最大的元素在a[1] (root结点) 每个k的父亲在k/2 每个k的孩子在k*2和k*2+1 3 二叉堆的操作 3.1 上浮(孩子大于父亲)--对应插入操作 循环,每次比较自己和父亲,如果比父亲大就交换,直到root. 3.2 插入 先把元