在我們有了建立哈夫曼樹的能力之后,其實(shí)哈夫曼編碼十分好實(shí)現(xiàn),我們只需要一次遍歷便可以將所有的哈夫曼編碼集合成一個(gè)哈夫曼編碼表了,具體代碼如下。
//建立哈夫曼編碼節(jié)點(diǎn)
//為了方便建立,這里使用的鏈表結(jié)構(gòu)
struct haffMapNode
{
char symbol; //實(shí)際字符
string code; //對(duì)應(yīng)編碼
haffMapNode* next;
};
//頭結(jié)點(diǎn)
struct haffMap
{
haffMapNode* head;
};
//遞歸遍歷二叉樹
void travelHaffTree(haffMap* (&mapHead),haffTree* tree,string code)
{
//傳入一個(gè)code來記錄遍歷的編碼
if(tree->lChild == NULL && tree->rChild == NULL)
{
//當(dāng)?shù)阶詈蟮娜~子節(jié)點(diǎn)的時(shí)候,這就是我們需要編碼的字符
haffMapNode* node = new haffMapNode;
node->code = code;
node->symbol = tree->symbol;
node->next = NULL;
//鏈表插入
if(mapHead->head == NULL)
{
mapHead->head = node;
}
else
{
node->next = mapHead->head;
mapHead->head = node;
}
}
//當(dāng)左子樹不為NULL時(shí),說明可以向左走,code追加‘0’
if(tree->lChild != NULL)
{
code.push_back('0');
travelHaffTree(mapHead,tree->lChild,code);
code.pop_back(); //清除之前追加的字符,為了不影響之后向右走(在同一層中)
}
//同理
if(tree->rChild != NULL)
{
code.push_back('1');
travelHaffTree(mapHead,tree->rChild,code);
code.pop_back();
}
}
//建立哈夫曼編碼圖
haffMap* creataHaffMap(haffTreeRoot* root)
{
haffMap* mapHead = new haffMap;
mapHead->head = NULL;
string code;
travelHaffTree(mapHead,root->next,code);
return mapHead;
}
這就是簡單的建立哈夫曼編碼圖的方法。