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

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

普通二叉树

树本身是没有节点数限制的,而二叉树顾名思义,就是每个节点最多只有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

总结

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

  • 普通二叉树、满二叉树、完全二叉树是带有一定基本限制条件的二叉树,更多作为定义存在,实际上直接使用这些树的应用场景较少。
  • 二叉查找树是一种最简单的能用于索引的树结构,但是性能不稳定。
  • 平衡二叉树跟红黑树是为了让二叉查找树的性能稳定而设计的树,其中,平衡二叉树限制较多,而红黑树在其基础上做了灵活的变通,使其旋转的代价较小,同时性能又比较稳定,在工程实践中更加适合。
  • 哈夫曼树是一种加权的二叉查找树,它的生成特点使其非常适合于对内容作编码优化。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容