哈夫曼編碼(代碼實(shí)現(xiàn))

在我們有了建立哈夫曼樹的能力之后,其實(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;
}

這就是簡單的建立哈夫曼編碼圖的方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近在做智能穿戴設(shè)備的項(xiàng)目,需要將一些狀態(tài)數(shù)據(jù)集合傳輸回APP端,由于數(shù)據(jù)集合稍大,如果原封不動(dòng)地將集合傳輸過去,...
    rh_Jameson閱讀 2,111評(píng)論 1 7
  • 什么是哈夫曼樹(Huffman Tree)eg:將百分制的考試成績轉(zhuǎn)換為五分制的成績if ( score < 60...
    Spicy_Crayfish閱讀 2,243評(píng)論 1 1
  • 定義指針變量,如果不賦給它地址,系統(tǒng)會(huì)隨機(jī)給它分配一個(gè)地址。 C++標(biāo)準(zhǔn)庫 C++ Standard Librar...
    縱我不往矣閱讀 346評(píng)論 0 1
  • 簡介 哈夫曼樹是一種帶權(quán)路徑長度最短的二叉樹,也稱為最優(yōu)二叉樹。 定義:給定 n 個(gè)權(quán)值作為 n 個(gè)葉子節(jié)點(diǎn),構(gòu)造...
    隨時(shí)學(xué)丫閱讀 3,333評(píng)論 0 1
  • 把工作和生活當(dāng)做軍訓(xùn),不斷演習(xí) 今天的晨讀內(nèi)容只有三條卻都是滿滿的干貨,點(diǎn)子太棒了,可我們要怎樣應(yīng)用到實(shí)際中呢? ...
    兜兜有糖902閱讀 305評(píng)論 0 0

友情鏈接更多精彩內(nèi)容