当前位置:首页 > 教育综合 > 正文

已知五个结点的权值分别是4,6,1,13,7

求用c语言实现霍夫曼编码的程序,最好能带讲解的程序。感谢!

//* * * * * * * * * * * * * * * * * * * * * * * * //哈夫曼树的构造哈夫曼树,哈夫曼编码 * //* * * * * * * * * * * * * * * * * * * * * * * * #include #include #include #include #include typedef struct {unsigned int weight; //结点权值 unsigned int parent,lchild,rchild; //结点

哈夫曼树这样构造对吗,

个人认为,这样构造的哈夫曼树欠妥,"结点8和结点11"放在"结点6和7"的右边比较合适.
分析过程如下:
五个权值是118625
(1)从小到大排序256811(这是有序序列)
(2)每次提取最小的两个结点,取结点2和结点5,组成新结点N7,其权值=2+5=7,
取数值较小的结点作为左分支,结点2作为左分支,而结点5就作为右分支.
(3)将新结点N7放入有序序列,保持从小到大排序:
6N7811
(4)重复步骤(2),提取最小的两个结点,结点6与N7组成新结点N13,其权值=6+7=13,
结点6数值较小,作为左分支,而N7就作为右分支.
(5)将新结点N13放入有序序列,保持从小到大排序:
811N13
(6)重复步骤(2),提取最小的两个结点,结点8与结点11组成新结点N19,其权值=8+11=19,
结点8的数值较小,作为左分支,结点11就作为右分支.
(7)将新结点N19放入有序序列,保持从小到大排序:
N13N19
(8)重复步骤(2),提取剩下的两个结点,N13与N19组成新结点N32,其权值=13+19=32,
数值较小的N13作为左分支,N19就作为右分支.
最后得到"哈夫曼树":
N32
/\
N13N19
/\/\
6N7811
/\
25
哈夫曼编码:
规定哈夫曼树的左分支代表0,右分支代表1.
得出所有结点的"哈夫曼编码":
权值11:11
权值8:10
权值6:00
权值5:011
权值2:010
哈夫曼树的带权路径长度是:
11*2+8*2+6*2+5*3+2*3=71

{4,5,6,7,8}作为权值构造Huffman树,带权路径长度?

先是4和5合并为9,再就是6和7合并为13,接着是8和9合并为17,最后是13和17合并为30,所以WPL = (6+7+8)*2 + (4+ 5)*3= 69。

例如:

假设有n个权值,则构造出的哈夫曼树有n个叶子结点,n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:

(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

(3)从森林中删除选取的两棵树,并将新树加入森林。

扩展资料:

哈夫曼动态编码:动态哈夫曼编码使用一棵动态变化的哈夫曼树,对第t+1个字符的编码是根据原始数据中前t个字符得到的哈夫曼树来进行的,编码和解码使用相同的初始哈夫曼树,每处理完一个字符,编码和解码使用相同的方法修改哈夫曼树;

所以没有必要为解码而保存哈夫曼树的信息。编码和解码一个字符所需的时间与该字符的编码长度成正比,所以动态哈夫曼编码可实时进行。

参考资料来源:百度百科-哈夫曼树

已知叶子结点A,B,C,D,E,F,G,H的权值分别是5,15,4,7,9,12,10,8试画出对应的赫夫曼树并计算

(1999-1)÷14=1998/14=142……10 1999应该在E列下面 ---------------------- A B C D E F G H 1 2 3 4 5 6 7 8 15 14 13 12 11 10 9 16 17 18 19 20 21 22 29 28 27 26 25 24 23 ... (减1后除以14的) 余数是14,在A列 余数是1或13,在B列 余数是2或12,在C列 余数是3或11,在D列 余数是4或10,在E列 余数是5或 9,在F列 余数是6或 8,在G列 余数是7 , 在H列

以数据集{4,5,6,7,10,12,18}为结点权值,画出构造的哈弗曼树。。。。。。。

问题一:

带权路径长度:6×3+7×3+12×2+4×4+5×4+10×3+18×2=18+21+24+16+20+30+36=165


问题二:

深度6

先序:EBADCFHGIKJ

中序:ABCDEFGHIJK

后序:ACDBGJKIHFE

形态:

展开全文阅读