需要帮助遍历树;霍夫曼编码

Need help traversing a tree; Huffman Coding

本文关键字:霍夫曼 编码 遍历 帮助      更新时间:2023-10-16

我已经创建了一个霍夫曼树,它似乎是正确的,但是当涉及到遍历数据结构时,我很弱。我根据根树中包含的信息在纸上画出了树,看起来很好,但是我的代码有问题,我不知道如何修复它。

第一个0是持久的,每次右移时,它似乎在后面附加了一个0。

example:
L: 01
H: 1111
but my traversal gives me:
L: 001
H: 01010101

代码片段
struct node
{
int symbol;
int frequency;
node* left;
node* right;
};
void Huffman::generateCode(node *tree, std::string code)
{
    if(tree->left == NULL && tree->right == NULL)
    {
        //std::cout << "Leaf Found: " << tree->symbol << "t" << code << std::endl;
        mapCode.insert(std::pair<int, std::string>(tree->symbol,code));
    }
    if(tree->left != NULL)
    {
        code.append("0");
        generateCode(tree->left, code);
    }
    if(tree->right != NULL)
    {
        code.append("1");
        generateCode(tree->right, code);
    }
}

UPDATE SOLVED: i figure out the code.append();函数把它搞砸了。我把它改成code + "0";

void Huffman::generateCode(node *tree, std::string code)
{
    if(tree->left == NULL && tree->right == NULL)
    {
        std::cout << "Leaf Found: " << tree->symbol << "t" << code << std::endl;
        mapCode.insert(std::pair<int, std::string>(tree->symbol,code));
    }
    if(tree->left != NULL)
    {
        generateCode(tree->left, code + "0");
    }
    if(tree->right != NULL)
    {
        generateCode(tree->right, code + "1");
    }
}

您错过了else:

void Huffman::generateCode(node *tree, std::string code)
{
    if(tree->left == NULL && tree->right == NULL)
    {
        //std::cout << "Leaf Found: " << tree->symbol << "t" << code << std::endl;
        mapCode.insert(std::pair<int, std::string>(tree->symbol,code));
    }
    else if(tree->left != NULL)
    {
        code.append("0");
        generateCode(tree->left, code);
    }
    else if(tree->right != NULL)
    {
        code.append("1");
        generateCode(tree->right, code);
    }
}