2013-11-28 140 views
0

我对如何从代码表构建huffman树感到困惑。该代码表包括2列,字符串码(二进制介绍)和SYMB(十六进制值)从代码表构建huffman树

的symbCode结构体:

struct symbCode 
{ 
char symb; 
string code; //string of '0' and '1' 
}; 

的功能:

void huffmanTree::buildTreeFromCodeTable(symbCode *table, int n) 
{ 
//construct the Huffman tree from the code table 
//n = number of symbols in the code table 

} 

我已经一派一些提供huffman树教程的网站。但我仍然无法弄清楚。 我应该新建一个树节点还是做其他事情?

参考表:

Num_Alphabet 96 
ASCII Huffman_Code 
    a  011000 
20  0100 
21  11101110110 
22  1110111010 
23  11101111000 
24  11101111001 
25  11110100001 
26  0000010000 
27  0000010001 
28  100100100 
29  100100101 
2a  000000100 
2b  000000101 
2c  0110010 
2d  101101000 
2e  1110010 
2f  0000000110 
30  11110101 
31  11110110 
32  11110111 
33  11111010 
34  11111011 
35  11111100 
36  11111101 
37  11111110 
38  11111111 
39  0000011 
3a  101101001 
3b  01100110 
3c  000001001 
3d  00000011 
3e  000000000 
3f  01100111 
40  0000000111 
41  00011 
42  1110011 
43  001010 
44  011010 
45  01010 
46  001000 
47  1110110 
48  1001000 
49  10101 
4a  0010011 
4b  1000001 
4c  011111 
4d  100001 
4e  010110 
4f  00010 
50  1111100 
51  00000101 
52  010111 
53  10100 
54  110000 
55  110011 
56  10010011 
57  100000010 
58  000000001 
59  10110101 
5a  000000010 
5b  11101111100 
5c  11101111101 
5d  11101111110 
5e  11101111111 
5f  11101110010 
60  11101110011 
61  10001 
62  100101 
63  110001 
64  110010 
65  10011 
66  101111 
67  101100 
68  011110 
69  11010 
6a  001011 
6b  011011 
6c  111100 
6d  00001 
6e  111010 
6f  01110 
70  101110 
71  111101001 
72  111000 
73  11011 
74  00110 
75  00111 
76  0010010 
77  10000000 
78  100000011 
79  1011011 
7a  1111010001 
7b  1110111101 
7c  11110100000 
7d  1110111000 
7e  11101110111 
+0

霍夫曼树是根据字符串中符号的频率构建的。那么考虑到哪些参考? – StoryTeller

+0

@StoryTeller添加了参考。 –

+0

我想这个表的想法是你开始从树的根部插入每个符号。二进制序列描述了你需要从根节点到目标节点的路径。将“0”解释为“左孩子”和“1”作为“右孩子”,以便在树上找到自己的路。但要求这个由Stackoverflow用户编写的代码是不合适的。 – jogojapan

回答

0

使用二叉树,并为每个节点有两个路径:左孩子,右孩子。对于左边的孩子意味着0,对于右边的孩子意味着1.在整棵树完成后,从根到叶子节点,路径(1s和0s的序列)是叶子节点中值的代码。

因此,表中的每个代码实际上是从根到叶的路径。选择一个接一个的代码,检查从根(和左边的代码)的路径,如果不存在,创建所有节点(包括叶);如果部分存在(代码中的左数字相同),请完成叶子的路径。