二叉树
二叉树的每个节点最多有两个孩子节点,也可能只有一个,也可能没有;这两个节点左边的叫左孩子,右边的叫右孩子,
满二叉树
就是说每一个分支都是满的,如图:
完全二叉树
如果这个树所有节点和同样深度的满二叉树的编号从1~n的节点位置相同,就叫完全二叉树(如图);满二叉树要求所有分支都是满的,而完全二叉树只需要保证最后一个节点之前的节点都齐全即可。
二叉树的存储
因为数据结构划分为物理结构和逻辑结构。二叉树属于逻辑结构,可以通过多种物理结构来表达,如链式存储结构,数组。
链式存储结构
因为链表分为数据域和指针域,所以二叉树的链式存储也一样,不同的是二叉树有左右两个孩子,所以就有左右两个指针,左指针和右指针,如图
数组存储
二叉树在数组中是按照层级顺序存储的,如果某一个孩子空缺,对应的数组位置也会空缺出来(如图),这样设计是为了更方便的在数组中定位二叉树的孩子节点和父节点,如果一个父亲的节点下标是parent,那么他的左孩子节点就是2 * parent + 1,右孩子节点就是2 * parent + 2,如果一个左孩子节点的下标是leftchild,那么他的父亲节点是(leftchild - 1)/ 2。
由上图也能看出来,如果一个二叉树非常稀疏的话,那么会造成空间的浪费。
二叉树的遍历
先序遍历
输出顺序是:根,左,右
上图的输出顺序是:1->2->4->5->3->6
中序遍历
输出顺序是:左,根,右
上图的输出顺序是:4->2->5->1->3->6
后序遍历
输出顺序是:左,右,根
上图的输出顺序是:4->5->2->6->3->1
二叉堆
二叉堆本质上是一种完全二叉树,分为两个类型,最大堆,最小堆。
最大堆
最大堆的任何一个父节点的值,都大于或等于它左、右孩子 节点的值。如图:
最小堆
最小堆的任何一个父节点的值,都小于或等于它左、右孩子 节点的值。如图:
二叉堆的根节点叫作堆顶,二叉堆的特点决定了,最大堆的堆顶元素是最大的,最小堆的堆顶元素是最小的。
二叉堆的自我调整
插入节点
以最小堆为例:
插入一个节点时,要和上一个节点进行比较,若小于上一个节点,就上浮,直到不小于上一个节点为止。
删除节点
删除节点时,会把最后一个节点临时补到删除的位置,然后在和子节点比较,去替换子节点较小的那个位置。
构建二叉堆
就是把一个无序的完全二叉树调整为二叉堆,本质就是让所有 非叶子节点依次“下沉”。最后变为最小堆。下图的无序完全二叉树最后结果是什么?大家可以自己想一下,然后看下面的答案。
先从最后一个非叶子节点开始也就是从10开始,然后节点3,下来是节点1,最后是节点7,结果如下:
优先队列
二叉堆是实现优先队列的基础。
优先队列不再服从先进先出的规则,而是分为下面的两种情况:
最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队
最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队
例如有一个最大优先队列,其中的最大元素是8,那么虽然8并不是队头元素, 但出队时仍然让元素8首先出队。要实现上述需求,线性数据结果并非不可以,只是时间复杂度较高,这时二叉堆就派上用场了。
可以用最大堆来实现最大优先队列,这样的话,每一次入队操作就是堆 的插入操作,每一次出队操作就是删除堆顶节点。
小结
什么是树?
树是n个节点的有限集,有且仅有一个特定的称为根的节点。当n>1时,其余节 点可分为m个互不相交的有限集,每一个集合本身又是一个树,并称为根的子树。
什么是二叉树?
二叉树是树的一种特殊形式,每一个节点最多有两个孩子节点。二叉树包含完全二叉树和满二叉树两种特殊形式。
二叉树的遍历方式有几种?
根据遍历节点之间的关系,可以分为前序遍历、中序遍历、后序遍历、层序遍历这4种方式;从更宏观的角度划分,可以划分为深度优先遍历和广度优先遍历两大 类。
什么是二叉堆 ?
二叉堆是一种特殊的完全二叉树,分为最大堆和最小堆。
在最大堆中,任何一个父节点的值,都大于或等于它左、右孩子节点的值。
在最小堆中,任何一个父节点的值,都小于或等于它左、右孩子节点的值。
什么是优先队列?
优先队列分为最大优先队列和最小优先队列。
在最大优先队列中,无论入队顺序如何,当前最大的元素都会优先出队,这是 基于最大堆实现的。
在最小优先队列中,无论入队顺序如何,当前最小的元素都会优先出队,这是 基于最小堆实现的。
Ending:
OK,本篇文章就到此结束了,非常感谢你能看到这里,所以如果你觉得这篇文章对你有帮助的话,请点一个大大的赞,支持一下博主,若你觉得有什么问题或疑问,欢迎私信博主或在评论区指出~