Я пытаюсь написать функцию, которая принимает дерево хаффмана и символ. Затем он должен кодировать символ и возвращать его.Кодирование двоичного дерева Хаффмана
код до сих пор:
string encode(NodePtr root, char letter)
{
string encode_str; //a string which will store the encoded string
NodePtr tempNode = root; //Initialize a new Huffman to be used in this function
NodePtr tempLeft = root->left;
NodePtr tempRight = root->right;
//A while loop that goes on until we find the letter we want
while((tempLeft->letter != letter) || (tempRight->letter != letter))
{
if((tempRight->is_leaf()) && (tempRight->letter == letter)) //check if is leaf and is letter
{
encode_str = encode_str + '1';
}
else if ((tempLeft->is_leaf()) && (tempLeft->letter == letter)) //check if is leaf and is letter
{
encode_str = encode_str + '0';
}
else if ((tempRight->is_leaf()) && (tempRight->letter != letter)) //check if is leaf and is NOT letter
{
tempNode = root->left;
tempLeft = tempNode->left;
tempRight = tempNode->right;
encode_str = encode_str + '0';
}
else if ((tempLeft->is_leaf()) && (tempLeft->letter != letter)) //check if is leaf and is NOT letter
{
tempNode = root->right;
tempLeft = tempNode->left;
tempRight = tempNode->right;
encode_str = encode_str + '1';
}
}
return encode_str;
}
Это не работает до сих пор и отладка не помогло мне либо. Может ли кто-нибудь помочь мне здесь или, по крайней мере, сказать мне, правильно ли я думаю.
Я думал, что корень-> левый или корень-> правый всегда был лист? Я основывал это на этом. Поэтому мой план состоял в том, чтобы проверить, был ли он листом и посмотреть, соответствует ли письмо. Если это не «идет по тропе» не листьев и пытается снова. Может быть, добавить encode (tempNode, letter), если! = Письмо? – user3265963
Примеры, например. на сайтах Википедии показаны два дочерних листа: http://en.wikipedia.org/wiki/File:Huffman_tree_2.svg - но вы, возможно, создали дерево со специальными свойствами, которые вы описываете; в этом случае следуйте описанным выше этапам отладки. – slim
Я думал, что прохожу по дереву с помощью tempNode = root-> right; , Тогда новый tempnode будет на один узел ниже предыдущего. – user3265963