C++ 基于哈夫曼树的解码算法/实现

C++ 基于哈夫曼树的解码算法/实现,c++,algorithm,tree,huffman-code,C++,Algorithm,Tree,Huffman Code,从如下所示的文本文件开始: a: 0 b: 100 c: 101 d: 11 0 0 100 100 11 101 所以这将解码:aabbdc 我可以使用什么解码算法来构建哈夫曼树,然后使用它来解码消息?示例代码也将非常感谢 以下是我的想法: 创建将每个符号映射到其位的查找表 创建根节点 要构建树,请从编码的 如果为0,则创建左子级。如果为1,请创建正确的子级 如果已到达空格,则以某种方式指示一个叶(空的左指针和右指针) 使用我们读取的位,直到那个空间,然后看看这是什么查找表 在该叶子

从如下所示的文本文件开始:

a: 0
b: 100
c: 101
d: 11

0 0 100 100 11 101
所以这将解码:
aabbdc

我可以使用什么解码算法来构建哈夫曼树,然后使用它来解码消息?示例代码也将非常感谢

以下是我的想法:

  • 创建将每个符号映射到其位的查找表
  • 创建根节点
  • 要构建树,请从编码的
    • 如果为0,则创建左子级。如果为1,请创建正确的子级
    • 如果已到达空格,则以某种方式指示一个叶(空的左指针和右指针)
      • 使用我们读取的位,直到那个空间,然后看看这是什么查找表
      • 在该叶子处插入字符

然后,我可以把每一点都读一遍,让它在树上移动。当它碰到空格时,我只会返回它到达的叶子处的字符?

输入中没有/不应该有空格。您应该得到类似于
0011101
的内容

要创建树,请从每个字符的根开始,对于每个位,如果是
0
,则向左,如果是
1
,则向右(在需要时创建节点)。当到达某个角色的末尾时,将我们所在节点的值设置为该角色

然后,从树中的根开始遍历输入-执行与上面相同的操作,但是,不要创建节点,而是在到达叶子时停止,在该节点处输出值并返回根

  .
 /
a
示例:

a=0
-只需为根目录创建一个左子目录

  .
 /
a
b=100
-向右(对于
1
),然后向左(对于
0
),然后再次向左(对于
0

c=101
-向右走,然后向左走,然后向右走

  .
 / \
a   .
   /
  .
 / \
b   c
  .
 / \
a   .
   / \
  .   d
 / \
b   c
d=11
-向右走,然后向右走

  .
 / \
a   .
   /
  .
 / \
b   c
  .
 / \
a   .
   / \
  .   d
 / \
b   c
处理输入时
00100

从根开始

  .
 /
a
我们得到一个
0
,所以向左走。
我们得到一个叶子,它的值是
a
,所以输出它并返回到根

  .
 /
a
我们得到一个
0
,所以向左走。
我们得到一个叶子,它的值是
a
,所以输出它并返回到根

  .
 /
a
我们得到了一个
1
,所以向右走。
我们得到一个
0
,所以向左走。
我们得到一个
0
,所以向左走。

我们得到一个值为
b
的叶子,因此输出它并返回根。

编写代码,看看会发生什么。用空格分隔代码消除了解码的所有复杂性,并且确实消除了代码无前缀的需要。此外,如果您对哈夫曼编码很认真,请查找基于表的解码。
  .
 /
a