数据结构:二叉堆原理及实现

二叉堆数组

最小堆和最大堆

最小堆的实现

创建最小堆及初始化参数

	private int cap = 10; //默认初始容量为10
    private int size = 0; //默认初始数据长度为0

    int[] items = new int[cap];  //二叉堆数组
	//各个节点对应的左右侧子节点、父节点索引值
    private int getLeftChildIndex(int parentIndex){return parentIndex*2+1;}
    private int getRightChildIndex(int parentIndex){return parentIndex*2+2;}
    private int getParentIndex(int childIndex){return (childIndex-1) /2;}
	
	//判断各节点是否含有父节点、左子节点、右子节点
    private boolean hasLeftChild(int index){return getLeftChildIndex(index)<size;}
    private boolean hasRightChild(int index){return getRightChildIndex(index)<size;}
    private boolean hasParent(int index){return getParentIndex(index)>=0;}
	
	//各节点对应的父节点、左右侧子节点的值
    private int leftChild(int index){return items[getLeftChildIndex(index)];}
    private int RightChild(int index){return items[getRightChildIndex(index)];}
    private int parent(int index){return items[getParentIndex(index)];}

二叉堆数组扩容

private void ensureExtraCap(){
        if (size == cap) {
            items = Arrays.copyOf(items,cap*2);
            cap *= 2;
        }
    }

数组索引值对应的value交换

private void swap(int indexOne,int indexTwo){
        int temp =items[indexOne];
        items[indexOne] = items[indexTwo];
        items[indexTwo] = temp;
    }

上浮

    public void heapifyUp(){
        int index = size - 1;
        while(hasParent(index) && parent(index) > items[index]){
            swap(getParentIndex(index),index);
            index = getParentIndex(index);
        }
    }

下沉

public void heapifyDown(){
        int index = 0;
        while(hasLeftChild(index)){
            int smallerChildIndex = getLeftChildIndex(index);
            if (hasRightChild(index) && RightChild(index) < leftChild(index)) {
                smallerChildIndex = getRightChildIndex(index);
            }
            if (items[index]<items[smallerChildIndex]) {
                break;
            }else{
                swap(index,smallerChildIndex);
                index = smallerChildIndex;
            }
        }
    }

添加value

public void add(int item){
        ensureExtraCap();
        items[size] = item;
        size++;
        heapifyUp();
    }

获取堆顶最值

public int peek(){
        if (size == 0) {throw new IllegalStateException();}
        int item = items[0];
        items[0] = items[size - 1];
        size--;
        heapifyDown(); 
    }

任意索引的数据上浮或下沉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值