【问题标题】:Binary Tree Search & Tracking二叉树搜索和跟踪
【发布时间】:2013-03-27 18:02:34
【问题描述】:

我有一个包含整数和字符的节点二叉树。我正在研究霍夫曼编码,我想获得节点的二进制表示。每个左分支都附加一个“0”,每个右分支附加一个“1”。

我正在考虑搜索一个 char 但跟踪其分支,如果它不在左侧节点中,请删除附加到字符串的最后一个“0”并返回并检查右侧。 这看起来非常有任务。我还有其他方法可以跟踪节点吗?

编辑: 我必须使用二叉树。

【问题讨论】:

  • 我的问题不清楚吗?
  • 真的是字符串吗?您不希望这些位成为实际位吗?
  • 哪个更好/更容易?
  • 取决于你想用它们做什么——如果你只是为了亲自检查结果(例如,如果你想了解霍夫曼编码的工作原理)那么字符串很好。如果您要对它们进行一些实际的压缩,那么位会更有用。 (否则你最终只会一直将字符串转换为位,这很慢而且毫无意义)
  • 哦,好吧。我只是用它们来理解霍夫曼编码。谢谢。

标签: c++ algorithm binary-tree huffman-code


【解决方案1】:

听起来像栈数据结构:

您可以通过以下方式使用堆栈来跟踪您在树中的位置:

  • 路径 = std::stack<int>
  • 向上移动到父级 == pop()
  • 移动到左孩子 == push(0)
  • 移动到右孩子 == push(1)

编辑:

您可能希望将std::vector<int>push_backpop_back 一起使用。它的行为仍然像一个堆栈,但如果你使用向量,你可以在最后得到整个 0 和 1 的列表。

【讨论】:

  • 那我该如何编码这些字符呢? 0 代表左边,1 代表右边。我怎么能用堆栈做到这一点?编辑:哦,我明白了...
【解决方案2】:

您是在谈论对 Huffman 输出进行编码吗?

您需要为每个可能的输入字符构建输出代码和长度表 - 不要遍历每个输入字符的树。

【讨论】:

  • 我必须使用二叉树。请参阅此链接en.wikipedia.org/wiki/File:N-ary_to_binary.svg char N 将是 0000
  • ..对于第一棵树。假设 A 的顶部还有另一个节点。
  • 对 - 您最初构建了二叉树,但一旦有了它,您就可以为每个字符构建一个输出代码和长度表。这些都应该是二进制数据类型,而不是字符串。
猜你喜欢
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2011-09-16
  • 2015-06-25
  • 2012-06-07
  • 1970-01-01
相关资源
最近更新 更多