1

私はハフマンツリーを作成しましたが、それは正しいように見えますが、データ構造のトラバースに関しては弱いです。ルートツリーに含まれている情報に基づいて紙にツリーを描画しましたが、問題はないようですが、コードに欠陥があり、修正するのが難しいかわかりません。

最初の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);
    }
}

解決済みの更新:code.append(); 関数はそれを台無しにしていました。私もそれを変更しましたコード+"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");
    }
}
4

1 に答える 1

1

あなたはsを逃した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);
    }
}
于 2013-03-07T01:30:09.003 に答える