《大话数据结构》笔记-赫夫曼树
从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称为路径长度。下图中,根结点到结点D的路径长度为4。*根的路径长度是从树根到每个结点的路径长度之和。*下图树路径长度为1+1+2+2+3+3+4+4=20
赫夫曼定义:假设有n个权值, 构造一棵有个叶子结点的二叉树,每个叶子结点带权,每个叶子结点的路径长度为,我们通常记作,其中带权路径长度最小的二叉树称为赫夫曼树。
对于上图中的二叉树 WPL=51+152+403+304+10*4=315, 式智能第一项5为A结点的权,1是A结点的路径长度,其他同理。
那怎么构造赫夫曼树呢?
1.先把有权值的叶子结点从小到大的顺序排列成一个有序序列,即:
2. 取取两个最小权值的结点作为一个新节点的两个孩子,相对较小的是左孩子,那么有如下图,新节点的权值为两个叶子权值的和5+10=15
- 将替换和, 插入有序序列中,从小到大排序,即
- 重复步骤2,将与B作为一个新结点的两个子结点. 如下图,的权值为=15+15=30
- 将替换与B, 插入有序序列,从小到大排列,即:
继续重复2、3步骤步骤,以为根结点,得到赫夫曼树
此时图6-12-8二叉树的带权路径长度WPL=401+601+302+153+104+54=205
通过上述步骤,可以得到构造赫夫曼树的赫夫曼算法描述:
- 根据给定的n个权值构成的n棵二叉树的集合,其中每棵二叉树中国只有一个带权为根结点,其左右子树为空
- 在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树且左结点的权值必须小于右结点。新的二叉树的根结点的权值为其左右子树上根结点的权值之和
- 在F中删除这两棵树,同时将新得到的二叉树加入F中,权值从小到大排序
- 重复2和3步骤,直到F只含一棵树为止。