template<class T>
void huffman(MinHeap<TreeNode<T>*> heap, int n)
{
for(int i=0;i<n-1;i++)
{
TreeNode<T> *first = heap.pop();
TreeNode<T> *second = heap.pop();
TreeNode<T> *bt = new BinaryTreeNode<T>(first, second, first.data, second.data);
heap.push(bt);
}
}
Dans mon manuel Fundamentals of Data Structures in C++, il a donné une définition de 2 page de codage de Huffman, et le code ci-dessus. Pour moi, le livre n'était pas assez détaillé, donc j'ai fait le googling et j'ai appris comment fonctionne le processus de codage Huffman. Le manuel prétend qu'à la fin du code ci-dessus, un arbre Huffman est fait. Mais pour moi, il semble faux, car un arbre Huffman, n'est pas nécessaire un arbre complet, mais le code ci-dessus semble toujours donner un arbre complet à cause de la heap.push()
. Alors quelqu'un peut-il m'expliquer comment ce morceau de code n'est pas faux?Je ne comprends pas cette implémentation de l'algorithme de Huffman
Ensuite, ce que je ne comprends pas, c'est que si le tas n'est pas nécessairement l'arbre de Huffman, comment puis-je traverser ou utiliser le tas pour trouver le nœud feuille correcte. – user299648
Le tas est une structure de données auxiliaire temporaire utilisée pour améliorer l'efficacité de l'opération de recherche des deux nœuds de Huffman avec le moins de poids. A la fin, le tas ne contient qu'un seul élément, un seul 'BinaryTreeNode', qui peut être déplacé et qui est alors la racine de l'arbre de Huffman fini; le tas peut alors être détruit car il n'est plus nécessaire. –
merci beaucoup! vous étiez vraiment utile. – user299648