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

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

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

  1. N 1 N_1 N1替换 A A A E E E, 插入有序序列中,从小到大排序,即 N 1 15 , B 15 , D 30 , C 40 N_115, B15, D30, C40 N115,B15,D30,C40
  2. 重复步骤2,将 N 1 N_1 N1与B作为一个新结点 N 2 N_2 N2的两个子结点. 如下图, N 2 N_2 N2的权值为=15+15=30
    《大话数据结构》笔记-赫夫曼树_第3张图片
  3. N 2 N_2 N2替换 N 1 N_1 N1与B, 插入有序序列,从小到大排列,即: N 2 30 , D 30 , C 40 N_230, D30, C40 N230,D30,C40
    继续重复2、3步骤步骤,以 T T T为根结点,得到赫夫曼树
    《大话数据结构》笔记-赫夫曼树_第4张图片
    此时图6-12-8二叉树的带权路径长度WPL=401+601+302+153+104+54=205

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

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

你可能感兴趣的:(数据结构与算法)