这里说的堆其实是一个完全二叉树,每个节点都不小于自己的子节点,不要跟jvm的堆搞混了.由于是完全二叉树,可以用数组来构建.用数组构建树的规则很简单:
一个节点的父节点下标为: (当前下标 - 1)/2
一个节点的左节点下标为: 当前下标 * 2 + 1
一个节点的右节点下标为: 当前下标 * 2 + 2
用数组来构建时,可以非常方便的访问最后一个最后一个节点,所以,堆比较适合于优先级队列之类的应用.每次新增节点时,总是先插入到数组最后一个空位,再依次跟父节点比对,如果父节点小就交换;每次删除节点时总是删除并返回根,然后将最后一个节点放到根的位置,再依次跟比较大的一个子节点比较,如果比子节点大就交换.
堆代码:
import java.util.ArrayList;
import java.util.List;
public class Heap <K,V>{
private List<Entity<K,V>> heap;
public Heap(){
heap = new ArrayList<Entity<K,V>>();
}
public void put(K key,V value){
Entity<K,V> e = new Entity<K,V>(key, value);
heap.add(e);
Comparable<? super K> k = (Comparable<? super K>)key;
int index = heap.size() - 1;
int parent = (index - 1) / 2;
while(index != parent && k.compareTo(heap.get(parent).key) > 0){
heap.set(index, heap.get(parent));
index = parent;
if(index == 0){
break;
}
parent = (index -1) / 2;
}
heap.set(index, e);
}
public V pop(){
Entity<K,V> e = heap.get(0);
if(heap.size() == 1){
heap.remove(0);
} else {
Entity<K, V> top = heap.remove(heap.size() - 1);
heap.set(0, top);
int left = 1;
int right = 2;
int current = 0;
while (left < heap.size()) {
int child;
Comparable<? super K> k = (Comparable<? super K>) heap.get(left).key;
if (right < heap.size() && k.compareTo(heap.get(right).key) < 0) {
child = right;
} else {
child = left;
}
k = (Comparable<? super K>) heap.get(current).key;
if (k.compareTo(heap.get(child).key) < 0) {
heap.set(current, heap.get(child));
heap.set(child, top);
current = child;
left = current * 2 + 1;
right = left + 1;
} else {
break;
}
}
}
return e.value;
}
public int size(){
return heap.size();
}
public boolean isEmpty(){
return heap.isEmpty();
}
private static final class Entity <K,V>{
private K key;
private V value;
public Entity(K key,V value){
this.key = key;
this.value = value;
}
}
}
分享到:
相关推荐
1. 堆二叉树:堆是一类特殊的二叉树,分为最大堆和最小堆,其中每个父节点的值都大于或等于其子节点的值。 2. 搜索二叉树:搜索二叉树是一种有序的二叉树,其中每个节点的左子树只包含小于该节点的元素,右子树包含...
堆排序----堆与堆排序10-从堆的定义可以看出,堆实质是满足如下性质的完全二叉树:二叉树中任一非叶子结点均小于(大于)它的孩子结点
在IT领域,二叉树和堆是两种非常重要的数据结构,它们在算法设计和实现中起着关键作用。本文将详细讲解二叉树和堆的相关知识点,并提供代码实现。 首先,二叉树是一种特殊的树形数据结构,其中每个节点最多有两个子...
堆是一种特殊的树形数据结构,它是完全二叉树的一个实例,具有特定的性质:每个父节点的值都大于或等于其子节点的值(大顶堆)或小于或等于其子节点的值(小顶堆)。这个特性使得堆在解决某些问题时非常有用,如优先...
5. 优先队列:二叉堆是一种实现优先队列的数据结构,常用于实现堆排序。 四、二叉树的操作优化 1. 哈夫曼树(最优二叉树):用于数据编码,通过构建最小带权路径长度的二叉树,达到数据传输的高效性。 2. 平衡二叉...
### 二叉树和堆的相关实验知识点 #### 实验背景及目标 本次实验主要围绕数据结构中的二叉树和堆进行。二叉树是一种非常重要的数据结构,在计算机科学中有广泛的应用,例如在搜索算法、排序算法以及文件系统等方面...
二叉树的创建与遍历 满二叉树:在满二叉树中...堆:堆是一种特殊的二叉树,其中父节点的值总是大于或等于子节点的值(最大堆)或小于或等于子节点的值(最小堆)。堆在优先队列、Dijkstra算法等场景中有着广泛的应用。
- 堆二叉树:分为大顶堆(父节点的值大于或等于其子节点的值)和小顶堆(父节点的值小于或等于其子节点的值),常用于优先队列的实现。 - 平衡二叉树:左右子树高度差不超过1,如AVL树和红黑树,确保高效查找。 3...
二叉树的基础知识是理解和掌握更复杂数据结构和算法的基础,包括堆、图以及各种高级数据结构的实现。对二叉树的深入理解将有助于提升编程能力,特别是在解决涉及数据组织和查找效率的问题时。对于初学者来说,熟练...
堆是一种特殊的二叉树,满足最大堆或最小堆性质,即父节点的值总是大于或小于其子节点的值。 转换算法通常涉及以下步骤: 1. 将二叉树的节点存储到数组中,按照从上至下、从左至右的顺序。 2. 根据数组中的节点构建...
4. 堆(Heap):一种特殊的二叉树,满足堆性质,如最大堆或最小堆。 5. 红黑树:一种自平衡二叉查找树,保证任何节点到其每个叶子节点的所有路径都包含相同数量的黑色节点。 二叉树的操作主要有以下几种: 1. 插入...
3. 堆排序:二叉堆可以用于堆排序。 4. 文件系统:文件系统可以使用二叉树来组织文件和目录。 二叉树遍历是数据结构中的一种基本操作,旨在访问树中的每个结点,并对其进行相应的处理。了解二叉树的定义、种类、...
这是一个经典的递归问题,由三个柱子和一堆不同大小的圆盘组成。目标是从一个柱子(起始柱)移动所有圆盘到另一个柱子(目标柱),同时遵守以下规则: 1. 任何时候,较大的圆盘不能位于较小的圆盘之上。 2. 每次只能...
- 堆:一种特殊的二叉树,分为最大堆(父节点值大于或等于其子节点值)和最小堆(父节点值小于或等于其子节点值)。 二、二叉树操作 1. 插入节点:在二叉树中插入一个新节点,需要确定其在树中的位置,通常是作为...
对于Huffman编码,还需要维护一个优先队列(通常用堆实现)来构建最小生成树。 总之,Java二叉树与Huffman编码是编程中处理数据结构和算法时的重要工具,它们在文件压缩、数据传输和搜索算法等领域有着广泛应用。...
2. 二叉堆:包括最大堆和最小堆,常用于实现优先队列,是堆排序的基础。 3. 二叉树的序列化和反序列化:将二叉树转化为线性表示,便于存储和传输。 通过深入理解和熟练掌握这些二叉树的操作方法,你可以有效地解决...
3. 路径压缩和秩压缩的二叉堆:在优先队列和最短路径算法中使用。 总结,二叉树作为一种基本的数据结构,其灵活性和高效性使其在许多领域都有广泛应用。理解并掌握二叉树的原理和操作,对于学习更高级的算法和数据...
此外,二叉树还有其他变种和扩展,比如二叉堆(用于优先队列)、AVL树(自平衡二叉搜索树)和红黑树(保证操作的性能同时维持一定的平衡)。在实际应用中,选择合适的二叉树类型和实现方式对程序性能至关重要。 ...
在实际应用中,二叉树常用于实现各种数据结构,比如堆(最大堆和最小堆)、哈夫曼树(用于数据压缩)以及二叉查找树(用于快速查找)。此外,二叉树的遍历方法也是许多算法的基础,如二叉搜索树的插入和删除操作,...
二叉树在许多算法中扮演关键角色,如二分查找、优先队列(使用堆)、哈夫曼编码(用于数据压缩)等。此外,二叉树在实现表达式树、文件系统目录结构、编译器语法分析等方面也有广泛应用。 在“erchashu.doc”和...