拿捏小算法——二叉树和二叉堆

二叉树

        二叉树的每个节点最多有两个孩子节点,也可能只有一个,也可能没有;这两个节点左边的叫左孩子,右边的叫右孩子,

满二叉树

        就是说每一个分支都是满的,如图:

完全二叉树

        如果这个树所有节点和同样深度的满二叉树的编号从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,本篇文章就到此结束了,非常感谢你能看到这里,所以如果你觉得这篇文章对你有帮助的话,请点一个大大的赞,支持一下博主,若你觉得有什么问题或疑问,欢迎私信博主或在评论区指出~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值