什么是堆?

堆就是用数组实现的二叉树,它没有使用父指针或者子指针。

堆的分类?

堆(heap)分为小根堆和大根堆两种,对于小根堆(根节点小于左节点或者右节点)它是具有如下特性的一颗完全二叉树:
1、若树根存在左孩子,则根节点的值小于等于左孩子结点的值;
2、若树根存在右孩子,则根节点的值小于等于右孩子结点的值;
3、以左、右孩子为根的子树又各是一个堆。

小根堆

 

 

 

  

 大根堆

堆和二叉树的区别?

节点的顺序在二叉搜索树中,左子节点必须比父节点小,右子节点必须必比父节点大。但是在堆中并非如此。在最大堆中两个子节点都必须比父节点小,而在最小堆中,它们都必须比父节点大。

内存占用:普通树占用的内存空间比它们存储的数据要多。你必须为节点对象以及左/右子节点指针分配额外的内存。堆仅仅使用一个数据来存储数组,且不使用指针。

平衡二叉搜索树必须是“平衡”的情况下,其大部分操作的复杂度才能达到O(log n)。你可以按任意顺序位置插入/删除数据,或者使用 AVL 树或者红黑树,但是在堆中实际上不需要整棵树都是有序的。我们只需要满足对属性即可,所以在堆中平衡不是问题。因为堆中数据的组织方式可以保证O(log n) 的性能。

搜索。在二叉树中搜索会很快,但是在堆中搜索会很慢。在堆中搜索不是第一优先级,因为使用堆的目的是将最大(或者最小)的节点放在最前面,从而快速的进行相关插入、删除操作。

 

使用场景:

1、宜采用顺序存储
2、查找最大值或最小值最为方便
3、插入或删除一个结点的时间复杂度为O(lbn)(lbn 已2为底n的对数)如log2 

posted @ 2020-06-03 17:24  暖暖-木木  阅读(188)  评论(0编辑  收藏  举报