从代码表构建一个霍夫曼树

时间:2013-11-28 18:09:31

标签: c++ tree ascii huffman-code

我对如何从代码表构建一个霍夫曼树感到困惑。代码表由2列组成,字符串代码(二进制表示)和symb(十六进制值)

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

}

我搜索了几个提供霍夫曼树教程的网站。但我仍然无法弄明白。 我应该新建一个树节点还是做其他事情?

参考表:

 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

1 个答案:

答案 0 :(得分:0)

使用二叉树,对于每个节点,您有两条路径:左边的孩子和右边的孩子。 to left child表示0,右子表示1.完成整个树之后,从root到leaf节点,路径(1s和0s的顺序)是叶节点中值的代码。

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