1.简介
接着上一篇 数组和链表,我们今天来聊一聊堆。我们都知道在操作系统中有堆栈这一概念,学过java的同学都知道java虚拟机中也有堆栈这么一说。栈负责管理函数的上下文以及一些基本类型变量,这一块由系统管理。堆存放新建的对象,并且会将其地址指向栈中的一个引用变量。如果没有任何引用,对象就成为垃圾对象,最后由垃圾回收器回收。但是我这里要聊的并不是内存中的堆,内存一般使用链表的形式来管理。但数据结构中堆的概念,相当于一种优先队列。
2.堆的定义和性质
1.定义
堆就是一棵完全二叉树,所谓的完全二叉树指的是树中的每一个节点位置和满二叉树中的位置相同,所谓的满二叉树指的是每一层树的节点都达到最大值(也就是树的每一层都被填满了);
最大堆:一个堆中父节点的值总是比子节点要大(优先队列)
最小堆:父节点的值总是比子节点要小
2.性质一节点位置关系
1.已知父节点位置是i,其左子节点的位置是 2i+1,右子节点的位置是2i+2
2.已知子节点的位置是i,其父节点的位置是 (i-1)/2
3.性质二高度
堆的高度是根节点到最远叶节点所需要走的步数,等于堆的层数减一。假设一共有n个节点,那么这n个节点组成的堆的高度为,此处对数以二为底。
如果堆的最下面一层被填满,则最小面一层的节点数量为,前面所有层的节点总和为