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);
}
}
在我的Fundamentals of Data Structures in C++教科書中,它給出了一個2頁的霍夫曼編碼定義和上面的代碼。對我來說,這本書還不夠詳細,所以我完成了Google搜索,並且瞭解了霍夫曼編碼的過程。該教科書聲稱,在上面的代碼的末尾,製作了霍夫曼樹。但對我來說,這似乎是錯誤的,因爲霍夫曼樹不需要一棵完整的樹,但上面的代碼似乎總是給出一棵完整的樹,因爲heap.push()
。那麼有人可以向我解釋這段代碼沒有錯嗎?我不明白這個霍夫曼算法的實現
然後我得不到的是,如果堆不一定是哈夫曼樹,我怎麼能遍歷或使用堆找到正確的葉節點。 – user299648 2010-07-17 00:09:59
堆是一種臨時輔助數據結構,用於提高查找權重最小的兩個霍夫曼節點的操作效率。最後,堆只包含一個元素,一個'BinaryTreeNode',它可以彈出,然後是完成的霍夫曼樹的根;堆可以被銷燬,因爲它不再需要。 –
2010-07-17 00:20:41
非常感謝你!你真的很有幫助。 – user299648 2010-07-17 00:26:16