堆和二叉堆的实现和特性

二叉堆:通过完全二叉树(不是二叉搜索树)
完全二叉树就是它的根和每一级节点都是满的,除了最小面一层的叶子可能不满
用二叉搜索树也可以实现堆(也可以,但是慢了,二叉搜索树,整体是有序的,可以找最小值,也可以找最大值,同时增加删除也是LogN,但是二叉搜索树找最小值就不是O(1)的就变成LogN了,因为要遍历这个树,找到最左边的叶子节点)

二叉堆(大顶)满足性质

1 是一颗完全树
2 树种任意节点的值总是 >= 其子节点的值 (保证根节点就是最大的值

二叉堆实现细节(二叉堆通过数组实现)

假设”第一个元素”在数组中的索引为0的话,则父节点和子节点位置关系如下:
1 索引为i的左孩子的索引是(2i + 1);
2 索引为i的左孩子的索引是(2
i + 2);
3 索引为i的父节点的索引是floor((i-1)/2)
堆和二叉堆的实现和特性_第1张图片

Inset插入操作

1 新元素一律先插入到堆的尾部
2 依次向上调整整个堆的结构(一直到根即可) 重新维护堆:把新元素挪到堆相应的位置
HeapifyUp
插入的节点跟父亲节点相比较,大于父亲节点进行交换,直到走到根 满足堆的性质

堆和二叉堆的实现和特性_第2张图片
堆和二叉堆的实现和特性_第3张图片
堆和二叉堆的实现和特性_第4张图片
堆和二叉堆的实现和特性_第5张图片
树的深度是logN所以最多也是调换logN次就到达了.

删除最大元素(堆顶)

1 将堆尾元素替换到顶部(即堆顶被替代删除掉)
2 依次从根部向下调整整个堆的结构(一直到堆尾即可),根部左儿子与右儿子比较,将最大的与根节点换
HeapifyDown
堆和二叉堆的实现和特性_第6张图片
注意:二叉堆是堆(优先 队列priority_queue)的一种常见且简单的实现,
但并不是最优的实现

你可能感兴趣的:(数据结构与算法)