【问题标题】:Build a huffman tree from a code table从代码表构建霍夫曼树
【发布时间】:2013-11-28 18:09:30
【问题描述】:

我对如何从代码表构建霍夫曼树感到困惑。代码表由2列组成,字符串code(二进制表示)和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

【问题讨论】:

  • 霍夫曼树是根据字符串中符号的频率构建的。那么参考在哪里考虑?
  • @StoryTeller 引用已添加。
  • 我想,表格的想法是您从树的根部开始插入每个符号。二进制序列描述了您需要从根节点到目标节点的路径。将0 解释为“左孩子”,将1 解释为“右孩子”,以便在树下找到自己的路。但是要求 Stackoverflow 用户编写此代码是不合适的。
  • @jogojapan 实际上我不知道如何开始...我应该新建一个节点吗?
  • 在 Stackoverflow 上要求完整代码被认为是不合适的。但我建议你在谷歌上搜索“二叉树 C++”或类似内容,并学习如何在 C++ 中构建二叉树。如果按照我上面描述的方式用节点填充二叉树,结果将是一棵霍夫曼树。

标签: c++ tree ascii huffman-code


【解决方案1】:

使用二叉树,每个节点都有两条路径:左孩子和右孩子。左孩子为0,右孩子为1。整棵树完成后,从根到叶节点,路径(1和0的顺序)就是叶节点中值的编码。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多