Java 数据结构与算法系列精讲之二叉堆
更新时间:2022年02月18日 09:58:39 作者:我是小白呀
二叉堆是一种特殊的堆,其实质是完全二叉树。二叉堆有两种:最大堆和最小堆。最大堆是指父节点键值总是大于或等于任何一个子节点的键值。而最小堆恰恰相反,指的是父节点键值总是小于任何一个子节点的键值
概述
从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章.

优先队列
优先队列 (Priority Queue) 和队列一样, 是一种先进先出的数据结构. 优先队列中的每个元素有各自的优先级, 优先级最高的元素最先得到服务. 如图:

二叉堆
二叉堆 (Binary Heap) 是一种特殊的堆, 二叉堆具有堆的性质和二叉树的性质. 二叉堆中的任意一节点的值总是大于等于其孩子节点值. 如图:

二叉堆实现
获取索引
// 获取父节点的索引值
public int parent(int index) {
if (index <= 0) {
throw new RuntimeException("Invalid Index");
}
return (index - 1) / 2;
}
// 获取左孩子节点索引
public int leftChild(int index) {
return index * 2 + 1;
}
// 获取右孩子节点索引
public int rightChild(int index) {
return index * 2 + 2;
}
添加元素
// 添加元素
public void add(E e) {
data.add(e);
siftUp(data.size() - 1);
}
siftUp
// siftDown
private void siftDown(int k) {
while (leftChild(k) < data.size()) {
int j = leftChild(k);
if (j + 1 < data.size() && data.get(j + 1).compareTo(data.get(j)) > 0) {
j++;
}
if (data.get(k).compareTo(data.get(j)) >= 0) {
break;
}
Collections.swap(data, k, j);
k = j;
}
}
完整代码
import java.util.ArrayList;
import java.util.Collections;
public class BinaryHeap<E extends Comparable<E>> {
private ArrayList<E> data;
// 无参构造
public BinaryHeap() {
data = new ArrayList<>();
}
// 有参构造
public BinaryHeap(int capacity) {
data = new ArrayList<>(capacity);
}
// 或者元素个数
public int size() {
return data.size();
}
// 判断堆是否为空
public boolean isEmpty() {
return data.isEmpty();
}
// 获取父节点的索引值
public int parent(int index) {
if (index <= 0) {
throw new RuntimeException("Invalid Index");
}
return (index - 1) / 2;
}
// 获取左孩子节点索引
public int leftChild(int index) {
return index * 2 + 1;
}
// 获取右孩子节点索引
public int rightChild(int index) {
return index * 2 + 2;
}
// 添加元素
public void add(E e) {
data.add(e);
siftUp(data.size() - 1);
}
// siftUp
private void siftUp(int k) {
while (k > 0 && data.get(parent(k)).compareTo(data.get(k)) < 0) {
Collections.swap(data, k, parent(k));
k = parent(k);
}
}
// siftDown
private void siftDown(int k) {
while (leftChild(k) < data.size()) {
int j = leftChild(k);
if (j + 1 < data.size() && data.get(j + 1).compareTo(data.get(j)) > 0) {
j++;
}
if (data.get(k).compareTo(data.get(j)) >= 0) {
break;
}
Collections.swap(data, k, j);
k = j;
}
}
}
到此这篇关于Java 数据结构与算法系列精讲之二叉堆的文章就介绍到这了,更多相关Java 二叉堆内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringData如何通过@Query注解支持JPA语句和原生SQL语句
这篇文章主要介绍了SpringData如何通过@Query注解支持JPA语句和原生SQL语句,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-11-11
Maven 多模块父子工程的实现(含Spring Boot示例)
这篇文章主要介绍了Maven 多模块父子工程的实现(含Spring Boot示例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-04-04
spring aop之@AfterReturning不生效问题及解决
这篇文章主要介绍了spring aop之@AfterReturning不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-05-05


最新评论