前言
本篇章主要介绍哈夫曼树及哈夫曼编码,包括哈夫曼树的一些基本概念、构造、代码实现以及哈夫曼编码,并用Python实现。
1. 基本概念
哈夫曼树(Huffman(Huffman(Huffman Tree)Tree)Tree),又称为最优二叉树,指的是带权路径长度最小的二叉树。树的带权路径常记作:
其中,nnn为树中叶子结点的数目,wkw_kwk为第kkk个叶子结点的权值,lkl_klk为第kkk个叶子结点与根结点的路径长度。
带权路径长度是带权结点和根结点之间的路径长度与该结点的权值的乘积。有关带权结点、路径长度的概念请参阅这篇博客。
对于含有nnn个叶子结点的哈夫曼树,其共有2n−12n-12n−1个结点。因为在构造哈夫曼树的过程中,每次都是以两颗二叉树为子树创建一棵新的二叉树,因此哈夫曼树中不存在度为1的结点,即n1=0n_1=0n1=0,由二叉树的性质可知,叶子结点数目n0=n2+1n_0=n_2+1n0=n2+1,所以n2=n0−1n_2=n_0-1n2=n0−1,总结点数目为n=n0+n1+n2=n+n−1=2n−1n=n_0+n_1+n_2=n+n-1=2n-1n=n0+n1+n2=n+n−1=2n−1。
2. 构造过程及实现
给定nnn棵仅含根结点的二叉树T1,T2,…,TnT_1,T_2,\dots,T_nT1,T2,…,Tn,它们的权值分别为w1,w