使用树进行霍夫曼解码的问题

时间:2013-11-28 03:04:19

标签: c++ algorithm huffman-code

我能够从文本文件中获取前缀并将它们放入向量中,例如:

所以我的代码:

  • 以根节点
  • 开头
  • 遍历向量,创建一个新节点。如果我们得到0,则取当前节点并让它的左指针指向新节点。如果我们得到1,则取当前节点并让它的右指针指向新节点。如果它是一个字符,则将该字符存储到当前节点并从根目录开始。

节点只是一个包含值并具有左右指针的东西。

这里出现了一些可怕的错误,但我不确定它到底是什么。有没有人看到实施中的任何明显问题?

编辑:我发现了一些有趣的东西。似乎它读取的每一点,直到它找到一片叶子。我猜这就是我编码的方式。例如,当读取“1”时,它会向右移动,再次向右移动,并且“c”为“d”。递归:(

2 个答案:

答案 0 :(得分:0)

一个问题是 - 在buildTree中,如果当前节点已经有孩子怎么办?您只需创建一个新子项并覆盖前一个子项。

如果节点还没有孩子,则应该只创建节点。

所以你的buildTree函数应该是这样的:

void Foo:: buildTree(vector<char> v) {
        node* root = new node; 
        vector<char>:: iterator itr;
        node* current = root; 

        for(itr =  v.begin(); itr != v.end(); itr++) {
            cout << *itr << ".";

            if (*itr == '0') {
                if (current->left == NULL)
                   current->left = new node;
                current = current->left;
            }
            else if (*itr == '1') {
                if (current->right == NULL)
                   current->right = new node;
                current = current->right;
            }
            else {  // is a symbol
                current->value = *itr; 
                current = root; 
            }
        }
        nodeVector.push_back(*root); 
}

另一个问题是你的decode函数 - 你在树中递归,但你传递的是同一个bit

我可能会完全废弃递归方法而只使用for循环。

一些伪代码:

current = root
for each character c
  if c == 0
    if current.left == NULL
      print current.value
      current = root
    else
      current = current.left
  else
    if current.right == NULL
      print current.value
      current = root
    else
      current = current.right

答案 1 :(得分:0)

您需要将 next bit传递给decode中的递归,而不是当前的递归。事实上,你可以不进行递归,只需从tempRoot返回新的decode并继续迭代。解码叶节点时不要忘记返回root

BTW:buildTree中有很多内存泄漏。