数据结构与算法(java描述)二叉堆

二叉堆的定义

二叉堆(英语:binary heap)是一种特殊的,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆。

当父节点的键值总是大于或等于任何一个子节点的键值时为“最大堆”。当父节点的键值总是小于或等于任何一个子节点的键值时为“最小堆”。---wiki百科

二叉堆的结构性质与堆序性质

结构性质:二叉堆是一颗完全二叉树,一棵高为h的完全二叉树有所以完全二叉树的高是logN。

二叉堆的插入操作:(上滤)一个例子即可说明:

                              

二叉堆的删除最小元素操作:

                                             

二叉堆的构建堆操作:

                                           

                                        

代码实现二叉堆

package com_DataStructureAndAlogorithm_Learning;

public class BinaryHeap<AnyType extends Comparable<? super AnyType>> {
	public BinaryHeap() {
		this(DEAFAULT_CAPACITY);
	}
	public BinaryHeap(int capacity) {
		currentSize=0;
		array=(AnyType[]) new Comparable[capacity+1];
	}
	public BinaryHeap(AnyType [] items) {
		currentSize=items.length;
		array=(AnyType[]) new Comparable[(currentSize+2)*11/10];
		int i=1;
		for(AnyType item:items) {
			array[i++]=item;
		}
		buildHeap();
	}
	private void buildHeap() {
		for(int i =currentSize/2;i>0;i--) {
			percolateDown(i);
		}
	}
	public void insert(AnyType x) {
		if(currentSize==array.length-1)
			enlargeArray(array.length*2+1);
		
		int hole=++currentSize;
		for(array[0]=x;x.compareTo(array[hole/2])<0;hole/=2) {
			array[hole]=array[hole/2];
		}
		array[hole]=x;
	}
	public AnyType findMin() {
		return array[1];
	}
	public AnyType deleteMin() {
		if(isEmpty()) {
			System.out.println("堆为空!");
		}
		
		AnyType minItem=findMin();//先找到最小的那个元素
		array[1]=array[currentSize--];//将需要重新安排再堆中的最后一个元素拿到第一个位置去,并将数组长度减去1
		percolateDown(1);
		
		return minItem;
		
	}
	private void percolateDown(int hole) {
		int child;
		AnyType tmp=array[hole];//先将需要重新插入的数据放入临时变量中
		for(;hole*2<=currentSize;hole=child) {//hole=child是记得要接着往下进行操作
			child=hole*2;//child是该位置的左节点
			if(child!=currentSize&&
			array[child+1].compareTo(array[child])<0) {
				/*
				 * 如果右子树的数据较小则将取右子树的数据和tmp进行对比
				 * 第一次比较:先将左右子树中的最小值拿出来
				 */
				child++;
			}
			if(array[child].compareTo(tmp)<0) {
				/*
				 * 将左右子树中较小的值拿出来和temp值进行比较
				 */
				array[hole]=array[child];
			}
			else
				break;
		}
		array[hole]=tmp;
	}
	public boolean isEmpty() {
		return currentSize==0;
	}
	public void makeEmpty() {
		currentSize=0;
	}

	private static final int DEAFAULT_CAPACITY=10;
	private int currentSize;
	private AnyType[] array;
	

	private void enlargeArray(int newSize) {

        AnyType [] oldArr = array;
        array = (AnyType []) new Comparable[newSize];

        for (int i = 0; i < oldArr.length; i++) {
            array[i] = oldArr[i];
        }
    }
	

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值