1. 定义
权: 树结点间的边相关的树,如图所示,A结点的权为5,B结点的权为15,可依次推导其他结点的权。
路径长度: 从树中一个结点到另一个结点之间的分支构成两个结点之前的路径,即路径上的分支数目。如图所示,二叉树a中根结点到结点D的路径长度为4,二叉树b中根结点到结点D的长度为2。
树的路径长度: 从树根到每一个结点的路径长度之和。二叉树a的树路径长度为1+1+2+2+3+3+4+4=20,二叉树b的树路径长度为1+2+3+3+2+1+2+2=16。
结点的带权的路径长度: 从该结点到树根之间的路径长度与结点上权的乘积。
树的带权路径长度: 树中所有叶子结点的带权路径长度之和。
赫夫曼树: 带权路径长度WPL最小的二叉树。二叉树a的WPL为5x1+15x2+40x3+30x4+10x4=315;二叉树b的WPL为5x3+15x3+40x2+30x2+10x2=220;
2. 构造流程
1)先把有权值的叶子结点按照从小到大的顺序排列成一个有序序列,即:A5,E10,B15,D30,C40;
2)取头两个最小权值的结点作为一个新结点N1的两个子结点,相对较小的为左孩子,新结点的权值为5+10=15;
3)将N1替换A和E,插入到有序序列中,保持从小到大排列,即:N1,B15,D30,C40;
4)重复步骤二。N1与B作为新结点N2的两个子结点,N2的权值为15+15=30;
5)将N2替换N1与B,插入到有序序列中,保持从小到大的排列,即N2,D30,C40;
6)继续重复上面的步骤,最终完成赫夫曼树的构造,如图所示:
最终得到的二叉树的带权路径长度为WPL=40x1+30x2+15x3+10x4+5x4=205。
3. 赫夫曼算法描述
1)根据给定的n个权值{w1, w2, w3...wn}构成n棵二叉树的集合F={T1, T2, T3...Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树为空;
2)在F中选取两个根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和;
3)在F中删除这两棵树,同时将新得到的二叉树加入f中;
4)重复步骤2、3,直到F只含一棵树为止,此时这棵树便是赫夫曼树;
4. 赫夫曼编码
赫夫曼编码的目的:解决数据传输的最优化问题。
设需要编码的字符集为{d1,d2 , d3,...dn},各个字符在电文中出现的次数或频率的集合为{w1,w2,w3,...wn},以d1,d2 , d3,...dn作为叶子结点,以
w1,w2,w3,...wn作为相应叶子结点的权值来构造一棵赫夫曼树。规定赫夫曼树的左分支代表0,右分支代表1,则从根结点到叶子结点所经过的路径分支
组成的0和1的序列变为该结点对应字符的编码。
部分参考:
《大话数据结构》
《算法导论》