堆 01 基础

堆 - Heap

  • 也是一种树结构,最典型的实现就是基于二叉树实现的堆,称为二叉堆
  • 二叉堆是一颗完全二叉树
  • 完全二叉树不一定是满二叉树,不满的部分一定是在整个树的右下侧,即把元素一层一层的码在二叉树上;
  • 中某个节点的值总是不大于其父节点的值,这样的堆称为最大堆(相应的也可以定义出最小堆);
  • 中,上层节点的值不一定大于下层节点的值;
  • 由于二叉堆的节点是一层一层码在二叉树上的,一种很巧妙的实现方式是用数组,相关公式如下:
    • parent(i) = (i - 1) / 2;
    • left child(i) = 2 * i + 1;
    • right child(i) = 2 * i + 2;
  • 物理上存储堆的数组是有索引的,对应逻辑上的二叉树上每个节点也是有索引的,索引从0开始,从根节点开始,一层层的码下来;

平衡二叉树

  • 平衡二叉树又被称为 AVL 树,它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1;

完全二叉树和平衡二叉树的关系

  • 完全二叉树是平衡二叉树;

最大堆的基础代码

  • 堆中元素的泛型要求能相互比较;
  • 3个私有方法用来获取给定索引的父节点的索引,左孩子的索引,右孩子的索引;
public class MaxHeap> {

    private Array data;

    public MaxHeap(int capacity){
        data = new Array<>(capacity);
    }

    public MaxHeap(){
        data = new Array<>();
    }

    // 返回堆中的元素个数
    public int size(){
        return data.getSize();
    }

    // 返回一个布尔值, 表示堆中是否为空
    public boolean isEmpty(){
        return data.isEmpty();
    }

    // 返回完全二叉树的数组表示中,一个索引所表示的元素的父亲节点的索引
    private int parent(int index){
        if(index == 0)
            throw new IllegalArgumentException("index-0 doesn't have parent.");
        return (index - 1) / 2;
    }

    // 返回完全二叉树的数组表示中,一个索引所表示的元素的左孩子节点的索引
    private int leftChild(int index){
        return index * 2 + 1;
    }

    // 返回完全二叉树的数组表示中,一个索引所表示的元素的右孩子节点的索引
    private int rightChild(int index){
        return index * 2 + 2;
    }
}

你可能感兴趣的:(堆 01 基础)