路径
路径与长度的概念
以一颗最简单的树作为例子:
在一棵树里面,从一个节点到另一个节点的路径,称之为这棵树的路径
例如B到H的路径为:
B->E->I
注意:一个节点到另一个节点的路径可以不止有一条
那么路径的长度就是一个节点到另一个节点之间所经历的树枝
例如:从B到I的路径长度为2,因为B->E->I中有两个“->”符号
注意:路径的长度并不是路径之间有几个节点就是多少,路径的长度指的是树枝的个数而不是节点的个数
带权路径长度
计算带权路径长度之前,我们必须给树的每一个节点赋予一个特殊的意义,一般我们会是数字,而这个数字就成为这个节点的权,带权路径长度就是路径长度×权
还是用上面这颗树举例子:
正如每个节点上的蓝色的字体一样,蓝色的字体就是这个节点的权
例如求从A到I的带权路径长度:
A到I的路径长度为:3 I的权为9
则A到I的带权路径长度为3*9=27
树的带权路径和
依旧以上面的那棵树作为例子,还是一样的蓝色的字代表节点的权
树的带权路径和的概念是:树的叶子节点的带权路径和的和
先分析上面那棵树的叶子节点为:D、H、I、F、G
他们的路径长度分别为:2、3、3、2、2
他们的权分别为:4、8、9、6、7
则整棵树的带权路径和为:24 + 38 + 39 + 26 + 2*7 = 8 + 24 + 27 + 12 + 14 = 32 + 27 + 26 = 85
哈夫曼树
哈夫曼树的定义:
根据百度百科的定义:哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。
哈夫曼树的构建
哈夫曼树的构建通常是给定几个节点并且给定这几个节点所代表的特殊数值,要我们排出这颗哈夫曼树的结构
哈夫曼树构建的精髓在于每次选择权最小的两个节点构成一颗子树,并且将构成的子树的根重新按照从小到大的顺序放在原本的节点选项中,重复这个过程,最后得到的树就叫做哈夫曼树
我们以数字 2 3 6 7 10 19 21 32 作为例子
下面是第一步,先找到权值最小的两个节点2和3,构成一颗子树5-2-3,并且将这颗子树的根5 按照顺序放在原本的数列中
第二步骤,找到该数列中此时最小的两个节点5和6,组合成新的一颗子树,并且按照顺序放在数列中,把这颗子树的根作为数列中的一部分:
第三步:找到此时最小的两个权值7和10,并且组成一颗新的子树放在其中:
第四步:找到此时最小的两个权值11和17,构成一颗新的子树,并且将根节点放入其中
第五步:找到此时最小的两个权值19和21,组成一颗新的子树并且按照顺序放入其中
第六步:找到此时两个最小的28和32组成一颗子树并且按照顺序放入数列中
最后一步:将剩下的两颗子树组成为一颗子树,并且按照顺序排好
哈夫曼编码
哈夫曼编码遵从顺着哈夫曼树的路径,如果路径经过的节点是往左边走,则在树枝上面标记0,如果经过的路径是往右走,则在树枝的上面标记1
还是用一开始的哈夫曼树作为例子:
我们根据往左走为0,往右走为1的规则给这颗哈夫曼树的树枝上标记上标号:
接下来我们开始读取哈夫曼编码,哈夫曼编码的读取根据只需要读取从根节点开始,到需要读取的节点路径上经过的树枝的记号
下面举几个例子:
B的编码为:0
D的编码为:00
H的编码为:010
F的编码为:10
G的编码为:11