哈夫曼树插入/检索值不正确 在赫夫曼编码和解码的C++实现中,当试图解码和输出结果时,我一直收到奇怪的输出。例如,给定输入:

哈夫曼树插入/检索值不正确 在赫夫曼编码和解码的C++实现中,当试图解码和输出结果时,我一直收到奇怪的输出。例如,给定输入:,c++,character-encoding,binary,huffman-code,C++,Character Encoding,Binary,Huffman Code,11 00001 01 11 101 01 11 1001 01 101 1000 01 000000011 00101 11 101 01 11 1001 01 00100 00011 01 101 1000 01 00010 0011 理论上,它应该解码为“如果它是,那就由我决定”,但我收到的是“如果,isefbe,,Ismftoff” 还有其他一些测试用例返回同样奇怪的结果,但是我不认为具体的结果有用,除了我非常确定我的插入到Huffman树中的实现在某种程度上是不正确的这一事实 然而,值

11 00001 01 11 101 01 11 1001 01 101 1000 01 000000011 00101 11 101 01 11 1001 01 00100 00011 01 101 1000 01 00010 0011

理论上,它应该解码为“如果它是,那就由我决定”,但我收到的是“如果,isefbe,,Ismftoff”

还有其他一些测试用例返回同样奇怪的结果,但是我不认为具体的结果有用,除了我非常确定我的插入到Huffman树中的实现在某种程度上是不正确的这一事实

然而,值得注意的是,我收到的结果中没有一个包含任何空格

我的哈夫曼树的代码是

void huffmanTree(huffmanNode *n, string prefix, char letter) {
    if (prefix.length() == 0) {
        n->character = letter;
    }
    if (prefix[0] == '0') {
        if (n->left == NULL) {
            n->left = new huffmanNode(0, '\0');
        }
        huffmanTree(n->left, prefix.substr(1, prefix.length()-1), letter);
    } else if (prefix[0] == '1') {
        if (n->right == NULL) {
            n->right = new huffmanNode(0, '\0');
        }
        huffmanTree(n->right, prefix.substr(1, prefix.length()-1), letter);
    }
}
问题也可能存在于我的遍历中,即:

char buffer[256];
huffmanNode *n = new huffmanNode(0, '\0');

while (true) {
    char first = file.get();
    if ((first == '\n') || (first == '\r')) {
        continue;
    }
    
    char second = file.get();
    if ((first == '-') && (second == '-')) {
        file.getline(buffer, 255, '\n');
        break;
    }
    file.getline(buffer, 255, '\n');
        
    string prefixCode = string(buffer);
    huffmanTree(n,prefixCode,first);
}
    
huffmanNode *n1 = n;
char bit;
    
while ((bit = file.get()) != '-') {
    if ((bit != '0') && (bit != '1')) {
        continue;
    }
    if (n1->left != NULL && bit == '0') {
        n1 = n1->left;
    }
    if (n1->right != NULL && bit == '1') {
        n1 = n1->right;
    }
    if (n1->left == NULL && n1->right == NULL) {
        cout << n1->getChar();
        n1 = n;
    }
}
char缓冲区[256];
huffmanNode*n=新的huffmanNode(0,'\0');
while(true){
char first=file.get();
if((first=='\n')| |(first=='\r')){
继续;
}
char second=file.get();
如果((第一个=='-')&&(第二个=='-')){
getline(缓冲区,255,“\n”);
打破
}
getline(缓冲区,255,“\n”);
字符串前缀代码=字符串(缓冲区);
huffmanTree(n,prefixCode,first);
}
赫夫曼诺德*n1=n;
字符位;
而((bit=file.get())!='-'){
如果((位!='0')&&(位!='1')){
继续;
}
如果(n1->left!=NULL&&bit==“0”){
n1=n1->左;
}
如果(n1->right!=NULL&&bit==“1”){
n1=n1->右;
}
如果(n1->left==NULL&&n1->right==NULL){
coutgetchar();
n1=n;
}
}

是否有一些显而易见的原因导致了我的遗漏?

您的树构建和解码代码看起来不错。可能您正在读取代码和符号的文件或读取该文件的代码有问题。您的
substr
可以工作,但不需要第二个参数。默认设置是转到结尾。与您的问题无关,但您需要在解码器中添加两个错误检查。首先,如果您的哈夫曼代码不完整,并且您得到的数据会将您发送到空分支。您需要检测并报告无效数据。其次,在循环结束时,需要检查
n1==n
。如果没有,则数据在未解码的代码的中间结束。