給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(huffman tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。
赫夫曼樹沒有使用真正的樹結構,而是用陣列來控制相應的結構,每乙個赫夫曼結點應該包含下列資訊。其中parent,left,right分別是父結點,左右孩子的下標。weight是結點的權值。
typedef struct
htnode, * huffmantree;
在 n 個權值中選出兩個最小的權值,對應的兩個結點組成乙個新的二叉樹,且新二叉樹的根結點的權值為左右孩子權值的和。
原有的 n 個權值中刪除那兩個最小的權值,同時將新的權值加入到 n–2 個權值的行列中,以此類推;
重複 1 和 2 ,直到所以的結點構建成了一棵二叉樹為止,這棵樹就是哈夫曼樹。
//篩選赫夫曼樹中未構建樹且權值最小的兩個結點
//end是赫夫曼樹的終點下標,s1,s2分別是最小的兩個結點的下標
void select(huffmantree ht, int end, int* s1, int* s2)
min1 = ht[i].weight;
*s1 = i;
i++;
while (ht[i].parent != 0 && i <= end)//再尋找乙個最近的,還沒有構建樹的結點
if (ht[i].weight < min1)//比較兩個結點的權值
else
for (int j = i + 1; j <= end; j++)//與剩下的所有的還未建立樹的結點進行比較
if (ht[j].weight < min1)//如果比最小的還小,替換最小的,原來最小的變成min2
if (ht[j].weight >= min1 && ht[j].weight < min2)//如果位於二者之間
}}
//建立赫夫曼樹
//w為儲存結點權值的陣列,n為結點個數
void createhuffmantree(huffmantree* ht, int* w, int n)
for (int i = n + 1; i <= m; i++)//構建哈夫曼樹
}
從葉子結點一直找到根結點,逆向記錄途中經過的標記。
從根結點出發,一直到葉子結點,記錄途中經過的標記。
typedef char ** huffmancode;
//hc為儲存結點哈夫曼編碼的二維動態陣列,n為結點的個數
void huffmancoding(huffmantree ht, huffmancode* hc, int n)
else
c = j; //以父結點為孩子結點,繼續朝樹根的方向遍歷
j = ht[j].parent;
} //跳出迴圈後,cd陣列中從下標 start 開始,存放的就是該結點的哈夫曼編碼
(*hc)[i] = (char*)malloc((n - start) * sizeof(char));
strcpy((*hc)[i], &cd[start]);
} free(cd);
}
//從根結點到葉子結點
void huffmancoding(huffmantree ht, huffmancode* hc, int n)
//一開始 p 初始化為 m,也就是從樹根開始。一直到p為0
while (p)
//當前結點沒有左孩子,也沒有右孩子,說明為葉子結點,直接記錄哈夫曼編碼
else if (ht[p].right == 0)
}//如果weight為1,說明訪問過一次,即是從其左孩子返回的
else if (ht[p].weight == 1)
}//如果訪問次數為 2,說明左右孩子都遍歷完了,返回父結點
else
}}
資料結構 赫夫曼樹
赫夫曼樹 huffman tree 又稱為最優樹,是一類帶權路徑長度最短的樹。本文僅討論最優二叉樹。樹的路徑長度是指從樹根到樹中其餘各個結點的路徑長度之和。對具有n個結點的二叉樹而言,完全二叉樹具有最短的樹的路徑長度。若在二叉樹中,樹葉結點帶有權值,則有 結點的帶權路徑長度定義為從樹根到該結點之間的...
資料結構 赫夫曼樹
赫夫曼編碼是首個試用的編碼方案。屬於無失真壓縮的編碼方案。在資料通訊中,赫夫曼編碼可以根據字元出現頻率,構造出一種不等長的二進位制,使編碼後的電文長度最短,且不產生二義性。weighteed path length是樹中所有節點的帶權路徑長度之和。wpl 值越小,說明構造出來的二叉樹效能越優。赫夫曼...
資料結構(八) 赫夫曼樹
一 基本介紹 1 給定n個權值作為n個葉子節點,構造一顆二叉樹,如果這個樹的帶權路徑長度達到最小,就叫做 最優二叉樹 也叫 赫夫曼樹 帶權路徑最短 最優二叉樹 赫夫曼樹 2 赫夫曼樹是帶權路徑長度最短的樹,權值較大的節點離根很近 二 重要概念 三 赫夫曼樹建立思路 乙個數列,要求轉成一顆赫夫曼樹 1...