文章目录
前言
在前面我们简单的学习了树的分类(戳这里) ,以下讲解都是基于二叉树的变种而来的。没看过的小伙伴可以点击链接看一下。
那么接下来就跟着我从它们的特性和使用来看看这些进阶树吧!
一、平衡二叉树(AVL)
在谈他的实现时我们在来看看他的一些性质
1. 可以是一棵空树(n = 0),也可以左右两个子树的高度差的绝对值不超过1。
2. 左右两个子树都是一棵平衡二叉树。
相比于正常的二叉树,他的性质是多了一个高度差的绝对值。
这一个性质解决了二叉查找树退化成链表的问题,但是如果进行频繁的操作,就会增加时间开销。
相比于二叉查找树来说他还是稳定多了。
排序
如图是平衡二叉树的插入结点会遇到的情况,如果想详细了解我会在后面的博客中在进一步介绍。
替罪羊树
同样替罪羊树也是AVL中的一种变形树
简介
可以将它看成一种非常暴力的二叉搜索树,表面上名字非常的高大上,但却是新手开始学习平衡树时最佳的选择。
因为他与其他的平衡树的区别在于,其他树是在原本的树上进行修改,而他却是直接退化成链表,在进化成树。
红黑树
红黑树是自平衡的二叉查找树,它相比于平衡二叉树多了颜色属性。
如图就是一颗非常标准红黑树
性质
- 结点是红色或黑色
- 根节点是黑色
- 每个红色结点的两个子节点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色结点)
- 从任意结点到其每个叶子的所有路径都包含相同数目黑色结点
排序
红黑树是在平衡二叉树一类中具有代表意义的树。
那么接下来我们就看看他的一些排序吧
-
换色
一般在加入的结点位于树根,没有父节点时直接变色。
-
右旋
左旋右旋其实都差不多,都是将树的子节点转化为到上一节点在不违反树的性质做出来的改变下面大家借助图来形象的了解一下,这里我就不展开细讲了。
- 左旋
在大多数情况下还是需要变色与旋转互相结合,才能保证树的平衡
应用
多应用于搜索,插入,删除多的情况
时间复杂化度O(lgn)
含n个结点的最高深度为2log(n+1)
红黑树也属于一种使用场景非常广泛的树
应用在c++的STl中。map和set都是用红黑树来实现的。
另外HashMap在JDK1.8的时候低层结构也引入了红黑树。
二、B树
详解
-
概念
因为二叉查找树是根据二分查找法来查找的,所以他的查找路径只有两条。 而B树的与平衡二叉树不同点又在于他的查找路径不止两条。
如图即为一颗标准B树
- 特点
- 所有的叶子结点都在同一层中。
- 每个结点中的索引值都是从小到大的,这与二叉排序树很类似。
- 因为在树的查询中,查询的时间与树的深度有关,所以树的深度越低,查询速度越快。
所以当数据量大时,使用AVL存储时会显得有些吃力。所以B树的诞生就很好的解决了这个问题,那就是他一个节点可以存储许多个数据。
B+树
B树的好处显而易见,但是还是有一些不足,那就是他不利于范围查找。
面对一些相邻的数据想取出来时,就需要从根结点一遍一遍的遍历,来获取数据。
相比B树的特点
- 两种结点,索引结点,叶子结点。
- 叶子结点连成一条链表。
- B树的索引不会重复,而B+树的非叶子结点一定会出现在叶子结点中,这与他的索引节点不存储数据有关。
-
应用
因为他相比于AVL的存储优势。数据库索引技术里大量使用B树和B+树的数据结构
三、特殊树
哈夫曼(霍夫曼)树
在了解这种特殊树(最优二叉树)的概念之前,我们先来看看一些概念。
基本概念
路径
在一颗树中,从一个节点往下可以到达孩子或孙子结点的通路,称为路径。
路径长度
若根结点的层数为 1,则从根结点到L层结点的路径长度为L-1
结点的权
在为每一个结点赋予一个重要程度的值。
结点的带权路径长度
从根结点到该结点之间的路径长度与该结点的权的乘积
定义
那么了解了上面的一些基本概念,那么在说哈夫曼树的定义就会很清楚了吧!
他就是结点的带权路径长度最小的一颗树。
在这里给大家举个小栗子应该就明白了
判断如图两颗树那一颗是哈夫曼树
先留给大家想想~~
揭晓答案:
第一颗树的结点带权路径:1 * 180 + 2*(30+150)+3 (20+10+50+100) = 1080
第二颗树的结点带权路径:1 * 180 + 2 (100+80)+ 3(50+30)+ 4 (20+10) = 900
很显然第二颗树的结点带权路径小于第一颗,所以第二颗树是哈夫曼树。
上面我们知道哈夫曼树是结点的带权路径最小的树。那么他有什么应用呢?
哈夫曼编码
在学习了哈夫曼树后,我们在介绍一下与他相关的应用。
哈夫曼编码又称霍夫曼编码,他是一种的编码方式。常用于密码学以及数据的压缩。
试想一下,如果需要传达一段编码来让对方识别,那么就需要这段编码简短一些
当我们提前知道了每一个符号出现的频率,我们就可以为他设置权重。可以理解为用短的编码来表示
反之就用长代码来表示。而哈夫曼树的精妙之处就在于他建立了一张用概率编织起来的表。
总结
以上就是一些特殊树的内容,本文仅仅介绍了简单特殊树的使用。