美文网首页转载部分
二叉树、平衡二叉树、红黑树、哈夫曼树

二叉树、平衡二叉树、红黑树、哈夫曼树

作者: chen_kaka | 来源:发表于2019-08-22 20:18 被阅读0次

    树是数据结构里面一个很重要的内容,它的有向无环图的结构,很适合用来做数据排列及检索,很多数据库的存储,都是使用的树这种数据结构来做存储的。
    下面让我们梳理下树的几种分类。鉴于有太多关于树的定义文章,本文不会对每种树给出定义及详细说明,只会梳理总结,关于各类树的定义,可参考其他文献的定义。

    普通二叉树

    树本身是没有节点数限制的,而二叉树顾名思义,就是每个节点最多只有2个子节点的树,除此之外,没有其他的限制。


    普通二叉树

    满二叉树跟完全二叉树

    在二叉树的基础上,满二叉树要求树的每个层级高度完全相同,且除了叶子节点,树上其他每个节点都必须有2个子节点。
    跟满二叉树不同,完全二叉树在最下层的叶子节点层可以不满,但必须是从左到右依次填充叶子节点,不能跳过。
    完全二叉树的创建思路完全按照广度优先遍历的方式,从根节点开始依次创建左右两个节点,然后把它的左右节点依次放到队列中,之后每次从队列中拿出一个元素,创建左右节点,并同时放入队列,如此反复。


    满二叉树跟完全二叉树

    二叉查找树(BST树)

    二叉查找树是一种搜索树,在普通二叉树的基础上,增加了数据比对的过程,从根节点开始往下比对,比当前节点数据小的,放左边,大的放右边。
    一般来说,二叉查找树的查找时间复杂度是O(Log2 n),但是在极端情况下,数据会倒向一侧,导致查找的性能极差,变成遍历查找,也就是O(n)。


    二叉查找树

    平衡二叉树(AVL树)

    平衡二叉树在二叉查找树的基础上添加了数据的平衡过程,它要求每一个节点,它的左子树跟右字数的高度差最多为1层,当节点的变化不符合这个条件时,需要通过从本节点开始,对树进行左旋或者右旋调整,然后逐层往上递归,判断其父节点是否需要左旋或者右旋,直到整棵平衡二叉树重新恢复平衡。


    平衡二叉树插入及平衡过程

    基于上述过程,二叉查找树存在的问题通过构建平衡二叉树能够得以解决。
    平衡二叉树在增删改的过程中增加了一些平衡的消耗,从而达到树的稳定结构,这对于以增删改为主的业务场景而言是不合适的,更适合读多写少的场景。

    红黑树

    前面几种树课本上基本都深入学习过,但是红黑树可能大部分人都听过,但是却没有深入去学习了解。
    红黑树的性质:

    1、节点是红色或黑色。
    2、根节点是黑色。
    3、每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
    4、从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

    红黑树的算法过程跟平衡二叉树类似,也是先在对应的子节点插入黑色节点数据,然后逐层往上递归判断是否符合红黑树的性质,不符合就左旋或者右旋,但由于它跟平衡二叉树相比:

    • 1、红黑树没有那样严格要求各个节点的高度差在1度以内,因此它重新旋转平衡过程的性能代价比平衡二叉树小,红黑树插入过程最多需要重新平衡旋转3次,而平衡二叉树不一定。
    • 2、红黑树的高度也可能平衡二叉树更高。但这是可以接受的一种折中方案,毕竟相比极端的二叉查找树,红黑树的稳定性还是非常高的,也是 O(Log2 n)。
    红黑树

    鉴于平衡二叉树的要求严格,因此红黑树实际上应用场景是远广于平衡二叉树的。而由于这两种树的旋转需求,因此它们更适合在内存的场景使用,比如java的TreeMap。
    平衡二叉树跟红黑树的算法时间复杂度都是O(Log2 n)。

    哈夫曼树

    哈夫曼树是一种带权重的,路径长度最短的最优二叉树。
    哈夫曼树的定义是:

    假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:
    (1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
    (2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
    (3) 从森林中删除选取的两棵树,并将新树加入森林;
    (4) 重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

    下面让我们看一颗哈夫曼树的构成。
    对于排序后的集合是:2,5,6,8,13,19,25,36 的内容,每次从集合中取出最小的两个数,从叶子节点开始构建,组成一个包含两个节点以及父节点的树(父节点的值是两个数的相加和),再把父节点放入集合中,重新执行构建过程,整个过程集合的变化情况是:
    2,5,6,8,13,19,25,36 ->
    7(2+5),6,8,13,19,25,36 ->
    8,13(6+7),13,19,25,36 ->
    13,19,21(8+13),25,36 ->
    下一轮的时候,由于拿出来的13跟19都小于21,因此无法加入21所在的树因此结果是:
    21(8+13),25,32(13+19),36 ->
    32(13+19),36,46(21+25) ->
    46(21+25),32(32+36) ->
    114
    最终结果是:


    哈夫曼树
    哈夫曼编码

    哈夫曼树对数据集进行编码的结果叫做哈夫曼编码。由于哈夫曼树带权路径最短的特点,哈夫曼编码的特点也是对数据重新编排,使得整个用哈夫曼编码组成的内容最短。
    对上述结果进行哈夫曼编码的话,是这样的一个过程:


    哈夫曼编码过程

    从而得出最终编码结果,各叶子节点从左到右分别是:

    8 :000
    6:0010
    2 :00110
    5:00111
    25:01
    13:100
    19:101
    36:11
    

    总结

    本文介绍了二叉树的几种常见的类型,包括普通二叉树、满二叉树、完全二叉树、二叉查找树、平衡二叉树、红黑树及哈夫曼树。
    其中:

    • 普通二叉树、满二叉树、完全二叉树是带有一定基本限制条件的二叉树,更多作为定义存在,实际上直接使用这些树的应用场景较少。
    • 二叉查找树是一种最简单的能用于索引的树结构,但是性能不稳定。
    • 平衡二叉树跟红黑树是为了让二叉查找树的性能稳定而设计的树,其中,平衡二叉树限制较多,而红黑树在其基础上做了灵活的变通,使其旋转的代价较小,同时性能又比较稳定,在工程实践中更加适合。
    • 哈夫曼树是一种加权的二叉查找树,它的生成特点使其非常适合于对内容作编码优化。

    相关文章

      网友评论

        本文标题:二叉树、平衡二叉树、红黑树、哈夫曼树

        本文链接:https://www.haomeiwen.com/subject/izxksctx.html