如何生成霍夫曼前缀码?

时间:2015-10-22 22:48:21

标签: c++ huffman-code prefix-tree

我正在研究一个c ++程序和我的小组,我无法弄清楚如何使用inOrder遍历生成前缀代码的逻辑。我们构建了PrefixCode树,我们希望从中生成代码。

由于我们遇到逻辑问题,我不知道是否需要提供任何代码。如果您需要,请告诉我。

感谢。

1 个答案:

答案 0 :(得分:1)

评论说,我不确定理解。买我会试试......

首先,我假设您已经正确构建了树。

其次,每个叶子包含要编码的符号。每个符号的代码由从根到叶的路径定义。最初,当您在根目录时,代码为空。如果您向左移动,则将0连接到代码。对称地,如果你向右移动,那么你连接1

第三,我假设你想要成对列表<symbol, code>symbol是一个字符,code是包含前缀代码的字符串。结果是树所代表的所有符号及其代码的列表。

现在,用于生成该列表的算法将使用堆栈来存储从根到当前节点的前缀。每次到达叶子时,代码都会进入堆栈,但是反转。这种算法可以如下:

void codes(Node * root, stack<char> & s)
{
  if (is_leaf(root))
    {
      auto symbol = // symbol stored in the node
      string code = // the reversed stack content; that is the code of current leaf
      cout << symbol << " = " << code << endl;
    }

  s.push('0');
  codes(LLINK(root), s);
  s.pop();

  s.push('1');
  codes(RLINK(root), s);
  s.pop();
}

我提出了一个堆栈,因为它是用于存储从根到节点的部分路径的“自然”数据结构。但是,也许它会更好vector<char>。在这种情况下,您应该push()替换push_back()pop()替换pop_back()。但优点是您可以使用反向迭代器构建代码。

此外,您可以使用列表或向量代替指令cout ...,并在其中插入对。之后,如果您愿意,您可以对其进行排序。或者,您可以使用“自然排序”的数据结构,例如二叉搜索树,并且您可以避免排序。当然,如果您感兴趣的话,所有这些都是按符号输出生成的。

我希望它有所帮助