2014-02-17 4 views
0

Я пытаюсь построить дерево кодирования Хаффмана.Huffman Кодирование дерева

главная:

int main() 
{ 
    // Read frequency table and build Huffman tree. 
    NodePtr huffman = build_tree(); 
    print_tree(huffman); 

    // Free the allocated memory. 
    free_memory(huffman); 

    return 0; 
} 

вход должен быть в форме:

number of letters 
"letter" number of occurrences 
"letter2" number of occurrences 

До сих пор я не получил его на работу. Какие-нибудь идеи, что может быть неправильным?

build_tree функция:

NodePtr build_tree() 
{ 
    int characters;//number of characters 
    cin >> characters; 
    char letter; 
    int freq; 
    HuffmanPriorityQueue queue; 
    NodePtr p; 
    for (int i = 0 ; i < characters; i++) 
    { 
     cin >> letter; 
     cin >> freq; 
     NodePtr temp = new HuffmanNode(freq, letter); 
     queue.push(temp); 
    } 
    for (int i = 0 ; i < characters - 1 ; i++) 
    { 
     NodePtr a = queue.top(); 
     queue.pop(); 
     NodePtr b = queue.top(); 
     NodePtr p = new HuffmanNode (a->frequency + b->frequency, NULL); 
     queue.push(p); 
    } 
    return p; 
} 

Функция печати: который был поставлен таким образом, я предполагаю, что это правильно.

void print_tree(NodePtr root, int indent = 0, string prefix = "") 
{ 
    // External nodes are not printed. 
    if (root == NULL) { 
     return; 
    } 

    char letter = ' '; 
    if (root->is_leaf()) { 
     letter = root->letter; 
    } 

    cout << string(indent, ' ') << prefix << "(" << letter << " [" << root->frequency << "]"; 
    if (root->is_leaf()) { 
     cout << ")" << endl; 
    } else { 
     cout << endl; 
     // Print left and right subtrees with the appropriate prefix, and 
     // increased indent (by INDENT_SIZE). 
     print_tree(root->left, indent + INDENT_SIZE, "0"); 
     print_tree(root->right, indent + INDENT_SIZE, "1"); 
     cout << string(indent, ' ') << ")" << endl; 
    } 
} 
+4

Похоже, вы не слишком знакомы с StackOverlflow, но «До сих пор я не получил его на работу» не самое лучшее место, чтобы начать вопрос. Что не работает, вы обнаружили какие-либо проблемы при отладке и т. Д. – crashmstr

+0

Да, я новичок в Stackoverflow и относительно новичок в C++, так извините мое невежество :). Ошибка в функции build_tree, и я не могу понять, откуда она взялась, хотя я пробовал отладчик (не эксперт в отладке либо к сожалению :() – user3265963

+0

Я думаю, что 'NodePtr p = new HuffmanNode (a-> частота + b-> частота, NULL); 'должно быть что-то вроде' NodePtr p = new HuffmanNode (a, b); '. – Jarod42

ответ

3

У вас есть несколько проблем:

  • Наружный NodePtr p никогда не назначается.
  • Там нет pop для NodePtr b
  • Новый узел не относится к своим детям a и b
  • Вы не возвращают корень.

Так следующее может помочь:

for (int i = 0 ; i < characters - 1 ; i++) 
{ 
    NodePtr a = queue.top(); 
    queue.pop(); 
    NodePtr b = queue.top(); 
    queue.pop(); 
    NodePtr p = new HuffmanNode (a, b); // The new node has two children `a` and `b`. 
    queue.push(p); 
} 
return queue.top(); // Return root. 
+0

Красивый, он работает Теперь. У меня был NodePtr p = new HuffmanNode (a-> частота + b-> частота, NULL); p-> left = a; p-> right = b; Вместо NodePtr p = new HuffmanNode (a, b) – user3265963

Смежные вопросы