知识点扫盲:二叉树之哈夫曼树
说起曼哈顿,我脑子闪过的念头就是:那位大佬不是搞原子弹的嘛?这个树跟他是怎么关系的说?是他发现的嘛?
带着这些问题我细品了一会。。。嗯,原来是哈夫曼,这就说通了。
哈夫曼树是由麻省理工学院的哈夫曼博士于1952年发明的。这颗树到底是什么树呢?我们来一起了解一下。
要认识哈夫曼树,首先需要知道几个知识点:
1.什么是路径
如上图所示,其中A,B,D,H就是一条路径
2.什么是路径长度
仍然使用二叉树的例子,从A到H共经过了三条边,此路径长度就是3
3.什么是节点的带权路径长度
假设H的权重为3,路径长度也是3,因此节点H的带权路径长度就是3*3=9
4.什么是树的带权路径长度
在这一棵树种,所有叶子结点的带权路径长度之和叫做树的带权路径长度,简称是WPL,以上面的二叉树为例,
树的路径长度是 3X3 + 6X3 + 1X2 + 4X2 + 8X2 = 53
哈夫曼树
那么哈夫曼树究竟是什么呢?就是在叶子结点和权重确定的情况下,树的带权路径长度最小的二叉树就是哈夫曼树,也叫做最优二叉树。
原则上,我们应该让权重最小的叶子结点远离树的根,权重大的叶子节点距离根近。
下图中左面就是一根哈夫曼树。
注意:同样的叶子节点很可能有多种哈夫曼树,下面几棵就都是哈夫曼树。
下面来介绍一下构建一颗哈夫曼树的方法:假设有6个叶子结点,权重依次是2,3,7,9,18,25
第一步:构建森林
每个单独的节点都能看作是一棵单独的树,这样子就形成了一个森林了
第二步:将当前权重最小的两个点结合,形成新的父节点
第三步:从队列中移除上一步中使用的最小的两个节点,并补充新的父节点
第四步:重复上述步骤,直至整棵树完成。
至此,一棵崭新的哈夫曼树就形成了。