一颗完全二叉树——堆(Heap)

设计背景

二叉树有满二叉树(Full binary Tree)和完全二叉树(Complete Binary Tree)等特殊情况,满二叉树指“除了叶子节点外,所有节点都有左子树和右子树”,它的叶子节点只会出现在最后一层;而完全二叉树因为有的节点可能缺失子树,所以它的叶子节点可能出现在最后的两层中
在这里插入图片描述
而堆(Heap)可以看作一颗完全二叉树的数组,堆有最大堆(MaxHeap)和最小堆(MinHeap)之分,最大堆中某个节点的值一定不大于其父节点的值,而最小堆中某个节点的值一定不小于其父节点的值。


结构分析

【底层实现】动态数组(ArrayList)
【核心方法】
public void add(E e); //添加元素
private void siftUp(int k); //元素上浮
public E extractMax(); //删除堆中最大的元素
private void siftDown(int k); // 元素下浮
public E replace(E e); //替换堆中指定的元素
public E findMax(); // 找到堆中最大的元素
【特别注意】堆所依赖的数组需要增加两个方法:

/**
 * 带参构造器:对实例域进行初始化
 * @param arr 数组
 */
public ArrayList(E[] arr) {
   
	data = (E[])new Object[arr.length];
    for (int i = 0; i < arr.length; i++) {
   
    	data[i] = arr[i];
    }
    size = arr.length;
}

/**
 * 方法:交换两个元素的位置
 * @param i 第一个元素的索引
 * @param j 第二个元素的索引
 */
public void swap(int i, int j) {
   
	if (i < 0 || i >= size || j < 0 || j >= size) {
   
		throw new IllegalArgumentException("Index is illegal!");
    }
	E t = data[i];
    data[i] = data[j];
    data[j] = t;
}

代码实现

利用动态数组实现堆:

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值