更详细的讲解:点击这里
【Huffman树的构造】
步骤:
① 根据 个权值 ,构造成 棵二叉树的集合 ,其中每棵二叉树只有一个权值为 的根结点,没有左、右子树;
② 在 中选取两棵根结点权值最小的树作为左、右子树构造一棵新的二叉树,且新的二叉树根结点权值为其左、右子树根结点的权值之和;
③ 在 中删除这两棵树,同时将新得到的树加入 中;
④ 重复②、③,直到 只含一颗树为止。
注意:如果选出的两个数字都不是已经构造好的二叉树里面的结点,则要另外开一棵二叉树。
详细来说就是,如果两个数的和正好是下一步的两个最小数的其中的一个,那么这个树直接往上生长就可以了;如果这两个数的和比较大,不是下一步的两个最小数的其中一个,那么就并列生长。
注意:对同一组叶子结点来说,哈夫曼树可以是不唯一的,但是最小带权路径长度一定是唯一的。
约定:构造Huffman树时,为了规范,规定F = {T1, T2, ⋯ , Tn}中权值小的二叉树作为新构造的二叉树的左子树,权值大的二叉树作为新构造的二叉树的右子树;在取值相等时,深度小的二叉树作为新构造的二叉树的左子树,深度大的二叉树作为新构造的二叉树的右子树。
【Huffman编码方法】
规定Huffman树中左分支代表“0”,右分支代表“1” 。从根结点到每个叶子结点所经历的路径分支上的“0”或“1”所组成的字符串,为该结点所对应的编码,称之为Huffman编码。
【例题】
假设用于通信的电文是由字符集 中的字符构成, 这 个字符在电文中出现的概率分别为 。
(1)请画出对应的huffman树 (按左子树根结点的权小于等于右子树根结点的权的次序构造)。
(2) 求出每个字符的huffman编码。