2015-11-13 63 views
1

假設您有一個C++程序,必須從給定的.txt文件中讀取文本。該程序將:從分鐘C++創建霍夫曼代碼樹

  • 文件中的每個字符,然後每個唯一字符(和它的頻率)的出現計算數目將被存儲爲一個新的樹節點
  • 然後,程序將生成一個包含一個最小堆這些節點,然後使用這個最小堆構建霍夫曼代碼樹。
  • 遍歷(預購和按順序)將被寫入輸出文件。樹的每個內部節點都將具有標籤I:xxx,其中xxx是int標籤,並且葉子具有L:xxx
  • 程序最終構造一個表,其中包含每個節點的編碼(基於ASCII,不是真正的.bin版本)作爲字符串存儲

角色,我想我會霍夫曼類中的每個節點存儲這樣的:

struct CharNode { 

     char value; 
     int frequency; 
     bool internal; 
     int label; 
     CharNode *parent; 
     CharNode *left_child; 
     CharNode *right_child; 
}; 

我不完全知道從哪裏着手。任何幫助將非常感激!

+0

第一步是從.txt文件中讀取數據。祝你好運。 –

回答

1

首先使用一個數組,該數組的長度足以讓您的應用程序能識別每個字符。現在檢查字符串,對與它們的ASCII值對應的數組元素進行增量。 (您可能需要減去初始ASCII值的某個基本量,因此您可以從第一個數組元素開始計算'a')

這部分也可以在C中輕鬆完成,因爲它使用字符和整數作爲等值。

完成後,您將所有字符都顯示爲出現次數。現在,一旦開始構建樹節點,就可以遍歷數組。並在該樹上使用堆算法。

或者只是對數組進行排序,然後從這裏開始構建樹。

祝您好運,快樂編碼:)

+0

我很困惑如何從這個數組中構建一個分鐘堆,以及如何將其轉換爲哈夫曼樹:( –

+0

使每個數組元素中的一個節點放到一個按數量排序的結構中創建一個新節點,使兩個小節點成爲子節點,並將此節點的數量設置爲它們的子節點的總和。從結構中刪除子節點,重新插入這個新節點,重新排序並重復直到你剩下一個節點,它將會/應該是你的霍夫曼樹的根 – Nils