繁体   English   中英

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

[英]issues with huffman decoding using tree

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

所以我的代码:

  • 从根节点开始
  • 遍历向量,创建一个新节点。 如果我们得到0,则取当前节点,并使其左指针指向新节点。 如果得到1,则取当前节点,并使其正确指向新节点。 如果是字符,则将该字符存储到当前节点并从根开始。

节点只是拥有值并具有左右指针的东西。

这里出了什么问题,但是我不确定这到底是什么。 有人看到实施中有任何明显的问题吗?

编辑:嗯,我发现了一些有趣的东西。 似乎每读取一次,它就会一直到找到叶子为止。 我想这就是我的编码方式。 例如,当读取“ 1”时,它会正确,再次正确地显示“ d”。 递归:(

一个问题是-在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

您需要将 bit传递给decode的递归,而不是当前位。 实际上,您无需递归即可执行操作,只需从decode返回新的tempRoot并继续进行迭代即可。 解码叶节点时,请不要忘记返回root

顺便说一句: buildTree很多内存泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM