算法学习记录——二叉堆的创建(JAVA实现)

本文深入探讨了二叉堆的概念,包括最大堆和最小堆的特性,以及如何使用数组来表示二叉堆。通过具体代码示例,详细介绍了二叉堆的构建过程,包括上浮和下沉操作,为读者提供了全面的二叉堆实现指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 二叉堆(一个满足特定条件的完全二叉树)相关的内容,比较抽象。

import java.util.Arrays;

//二叉堆实际就是一个完全二叉树,即最后一个叶子节点前的所有节点都在。
//二叉堆存储在数组中。
/*二叉堆有两个类型:
 * 一个是最大堆——任何一个父节点都大于或者等于它左右孩子节点的值,
 * 一个是最小堆——任何一个父节点都小于或者等于它左右孩子节点的值。
 */

public class HeapTest {

	//二叉堆(最小堆)的“上浮”操作
	//从最后一个叶子节点开始,小于父节点就进行上浮操作。
	public static void upAdjust(int[] array) {
		
		int childIndex=array.length-1;
		int parentIndex=(childIndex-1)/2;
		
		int temp=array[childIndex];
		
		while(childIndex>0 && temp>array[parentIndex]) {
			
			array[childIndex]=array[parentIndex];
			childIndex=parentIndex;
			parentIndex=(parentIndex-1)/2;
		}
		
		array[childIndex]=temp;
		
	}
	
	
	//二叉堆(最小堆)的“下沉”操作
	//array        要进行下沉操作的堆(数组)
	//parentIndex  要下沉的父节点
	//length       当前下沉堆(数组)的长度
	private static void downAdjust(int[] array, int parentIndex, int length) {
		// TODO Auto-generated method stub
		int temp=array[parentIndex];
		int childIndex=2*parentIndex+1;
		
		while(childIndex<length) {
			
			if(childIndex+1<length && array[childIndex]>array[childIndex+1]) {
				childIndex++;
			}
			
			if(temp<=array[childIndex]) {
				break;
			}
			
			array[parentIndex]=array[childIndex];
			parentIndex=childIndex;
			childIndex=childIndex*2+1;
			
		}
		
		array[parentIndex]=temp;
	}

	//二叉堆(最小堆)的构建
	//从最后一个父节点开始“下沉”操作,构建最小堆。
	public static void buildHeap(int[] array) {
		for(int i=(array.length-2)/2;i>=0;i--) {
			downAdjust(array,i,array.length);
		}
	}
	
	
	

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array = new int[] {1,3,2,6,5,7,8,9,10,0};
		upAdjust(array);
		System.out.println(Arrays.toString(array));
		
		array=new int[] {7,1,3,10,5,2,8,9,6};
	    buildHeap(array);
	    System.out.println(Arrays.toString(array));
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值