1. 程式人生 > >【資料結構筆記】哈夫曼樹的構造演算法

【資料結構筆記】哈夫曼樹的構造演算法

原教材《資料結構教程》(第5版)李春葆 主編(武漢大學資料結構課程教材)

《演算法筆記》那本書上並沒有直接給出哈夫曼樹的構造程式碼,特此記錄一下。

核心程式碼:

typedef struct{
    char data;
    double weight;//權重
    int parent;
    int lchild;
    int rchild;
}HTNode;
void CreateHT(HTNode ht[],int no)//no個葉子結點
{
    int i,k,lnode,rnode;
    double min1,min2;
    for(i=0;i<2*no-1;i++)//no個葉子結點的哈夫曼樹有2*no-1個結點,初始化
        ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
    for(i=no;i<=2*no-2;i++)//構造no-1個分支結點
    {
        min1=min2=32767;//設為較大的數
        lnode=rnode=-1;//lnode和rnode為最小權重的兩個結點位置
        for(k=0;k<=i-1;k++)
        {
            if(ht[k].parent==-1)
            {
                if(ht[k].weight<minl)
                {
                    min2=min1;
                    rnode=lnode;
                    min1=ht[k].weight;
                    lnode=k;
                }
                else if(ht[k].weight<min2)
                {
                    min2=ht[k].weight;
                    rnode=k;
                }
            }
        }
        ht[i].weight=ht[lnode].weight+ht[rnode].weight;
        ht[i].lchild=lnode;
        ht[i].rchild=rnode;
        ht[lnode].parent=i;
        ht[rnode].parent=i;
    }
}

舉個栗子叭~(直接紙上模擬,來說明如何在尚未構造二叉樹的結點中尋找權值最小的兩個結點)

如初始結點為 1 7 3 5 

在紙上寫了一些關鍵的程式碼,emmmm我知道既不簡潔也不美觀(還字醜)哈哈哈

(皮毛的ps技術學以致用hhh)

自己舉個例子手動模擬一下就能明白啦:

min1,lnode是分別記錄權值最小的結點的大小和下標

min2,rnode是記錄權值第二小的結點的大小和下標

且如果有比當前min1小的結點,那麼min2就會繼承之前記錄的那個min1的值(包括對應的lnode),再更新min1和lnode。

就醬~結束·