《大话数据结构》笔记-赫夫曼树

从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称为路径长度。下图中,根结点到结点D的路径长度为4。*根的路径长度是从树根到每个结点的路径长度之和。*下图树路径长度为1+1+2+2+3+3+4+4=20
《大话数据结构》笔记-赫夫曼树

赫夫曼定义:假设有n个权值{w1,w2,...,wn}\{w_1, w_2, ..., w_n\}, 构造一棵有nn个叶子结点的二叉树,每个叶子结点带权wkw_k,每个叶子结点的路径长度为lkl_k,我们通常记作,其中带权路径长度WPLWPL最小的二叉树称为赫夫曼树。
对于上图中的二叉树 WPL=51+152+403+304+10*4=315, 式智能第一项5为A结点的权,1是A结点的路径长度,其他同理。
那怎么构造赫夫曼树呢?
1.先把有权值的叶子结点从小到大的顺序排列成一个有序序列,即:A5,E10,B15,D30,C40A5, E10, B15, D30, C40
2. 取取两个最小权值的结点作为一个新节点N1N_1的两个孩子,相对较小的是左孩子,那么有如下图,新节点的权值为两个叶子权值的和5+10=15
《大话数据结构》笔记-赫夫曼树

  1. N1N_1替换AAEE, 插入有序序列中,从小到大排序,即N115,B15,D30,C40N_115, B15, D30, C40
  2. 重复步骤2,将N1N_1与B作为一个新结点N2N_2的两个子结点. 如下图,N2N_2的权值为=15+15=30
    《大话数据结构》笔记-赫夫曼树
  3. N2N_2替换N1N_1与B, 插入有序序列,从小到大排列,即:N230,D30,C40N_230, D30, C40
    继续重复2、3步骤步骤,以TT为根结点,得到赫夫曼树
    《大话数据结构》笔记-赫夫曼树
    此时图6-12-8二叉树的带权路径长度WPL=401+601+302+153+104+54=205

通过上述步骤,可以得到构造赫夫曼树的赫夫曼算法描述:

  1. 根据给定的n个权值w1,w2,...,wn{w_1, w_2, ..., w_n}构成的n棵二叉树的集合F={T1,T2,...,Tn}F=\{T_1, T_2, ..., T_n\},其中每棵二叉树TiT_i中国只有一个带权为wiw_i根结点,其左右子树为空
  2. 在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树且左结点的权值必须小于右结点。新的二叉树的根结点的权值为其左右子树上根结点的权值之和
  3. 在F中删除这两棵树,同时将新得到的二叉树加入F中,权值从小到大排序
  4. 重复2和3步骤,直到F只含一棵树为止。