一、哈夫曼树的基本概念
哈夫曼树也叫最优二叉树。
结点数目相同的二叉树中,完全二叉树是路径长度最短的二叉树。反过来不成立。
满二叉树不一定是哈夫曼树,权值越大离根越近。具有相同带权结点的哈夫曼树不唯一。
二、哈夫曼树的算法
1,哈夫曼树的构造算法
把n个结点看成n颗二叉树,每次选取权值最小的两个根结点构成新的树,新的根结点的权值为左右子树根结点之和,新根结点的权值和剩余的权值比较,再选出最小的两个结点,重复上述步骤,直到森林中只有一颗树。
哈夫曼树只有度为0和2的结点。包含n个叶子结点(度为0)的哈夫曼树经过n-1次合并产生n-1个新结点(度为2),所以总共有2n-1个结点。
2,哈夫曼树算法实现
顺序存储:一维结构数组,2n-1个数组,定义2n大小的数组,只用1~2n-1,0空着。
三、哈夫曼的编码
1,哈夫曼的编码思想
关键:要设计长度不等(出现频率高的长度更短,可以节约空间)的编码,任意字符不是其他字符的前缀(前缀编码)
哈夫曼树是前缀编码(没有一个叶子结点的祖先是别的叶子结点),且能保证字符编码总长度最短(因为哈夫曼树的带权路径长度最短)(最优前缀码)。
2,哈夫曼编码的算法实现
从一维数组的叶子结点出发,找双亲结点,根据双亲结点的指针域确定是左孩子还是右孩子,并且标记为0或者为1,继续从该结点找其双亲结点,重复步骤直到双亲结点的parent域为0,说明到根结点了。每个叶子结点重复该步骤。
需要一个二维数组记录每个叶子结点的编码,数组第一列为叶子结点的字符,第二列为字符顺序i(i=1~n),第三列存放字符编码(一个字符串),(哈夫曼树最高n-1层,因此字符串长度为n,前n-1存放编号,n位置存放\0,而且存放时从字符串的最后往前存放)。
3,文件的编码和译码
根据接收的字符频度表来构建哈夫曼树。