一、预备知识
• 结点的路径长度:从根结点到该结点的路径上所包括的边的数目;
• 树的内路径长度:除叶结点外,从根到树中其他所有结点的路径长度之和;
• 树的外路径长度:从根结点到树中所有叶子结点的路径长度之和;
• 扩充二叉树:除叶子结点外,其余结点都必须有两个孩子,也称为2-树;
• 定理:一颗扩充二叉树的内路径长度和外路径长度分别记为I和E,n为非叶结点个数,则有E=I+2n;
• 叶结点的加权路径长度:设叶结点是带权的,则叶结点的加权路径长度是其路径长度与权值的乘积。
• 树的加权路径长度:所有叶结点的加权路径长度之和,记为WPL;
• 加权路径长度WPL的内涵(结合字符编码应用场景)
✓ 每一个叶结点表示一个字符;
✓ 叶结点权值表示对应字符在文本中的出现频度;
✓ 叶结点的路径长度表示对应字符的编码长度;
哈夫曼树就是一种具有最小加权路径长度的扩充二叉树。
二、哈夫曼树与哈夫曼算法
• 哈夫曼算法:求具有最小加权路径长度二叉树的算法
• 哈夫曼树:用哈夫曼算法构造生成的二叉树
✓ 哈夫曼树是一棵扩充二叉树;
✓ 哈夫曼树中任一非叶节点的权值等于其左右孩子的权值之和;
✓ 对于叶节点相同二叉树而言,哈夫曼树的加权路径长度是最小的;
哈夫曼编码
• 压缩编码的原则
无二义性,即编/解码的双向唯一性;
压缩率和编/解码效率的平衡;
• 前缀编码:一个字符的编码不是另一个字符编码的前缀
• 利用哈夫曼树构造哈夫曼编码
已知文本的字符集S,以及对应的权值集合W,权值表示对应字符的频度,执行如下步骤:
- 根据W构造哈夫曼树,叶结点权值代表对应的字符;
- 按照左孩子分支标记编码0,右孩子分支标记编码1的原则(左0右1),为哈夫曼树中的分支标记0/1编码;
- 叶子节点对应字符的编码,即为从根结点到该叶子节点的路径中,经过各孩子分支所形成的0/1编码序列。