構造最優二叉樹
哈夫曼首先給出了對於給定的葉子數目及其權值構造最優二叉樹的方法
(
只有一個權值為w i 的根結點
(
了保證新樹仍是二叉樹
)
(
用哈夫曼算法構造哈夫曼樹的過程見【 動畫演示 】
注意
① 初始森林中的n棵二叉樹
② n個葉子的哈夫曼樹要經過n
③ 哈夫曼樹是嚴格的二叉樹
(
用一個大小為
#define n
#define m
typedef struct { //結點類型
float weight; //權值
int lchild
}HTNode;
typedef HTNode HuffmanTree[m]; //HuffmanTree是向量類型
注意
因為C語言數組的下界為
右孩子和雙親結點在向量中的下標
這裡設置parent域有兩個作用
點
(
在上述存儲結構上實現的哈夫曼算法可大致描述為(設T的類型為HuffmanTree)
(
將T[
(
讀人n個葉子的權值存於向量的前n個分量(即T[
(
對森林中的樹共進行n
①在當前森林T[
② 將根為T[p
將T[p
將T[i]的lchild和rchild分別置為p
新結點T[i]的權值置為T[p
注意
合並後T[pl]和T[p
哈夫曼算法模擬演示過程【 參見動畫模擬 】
(
void CreateHuffmanTree(HuffmanTree T)
{//構造哈夫曼樹
int i
InitHuffmanTree(T); //將T初始化
InputWeight(T); //輸入葉子權值至T[
for(i=n;i SelectMin(T,i-1,&p1,&p2); //在T[0..i-1]中選擇兩個權最小的根結點,其序號分別為p1和p2 T[p1].parent=T[p2].parent=i; TIi].1child=p1; //最小權的根結點是新結點的左孩子 T[j].rchild=p2; //次小權的根結點是新結點的右孩子 T[i].weight=T[p1].weight+T[p2].weight; } // end for } 上述算法中調用的三個函數【參見練習】。tW.WinGwIt.COm 【例】以7個權值:7,5,1,4,8,10,20為例,執行CreateHuffmanTree求最優二叉樹的過程
From:http://tw.wingwit.com/Article/program/sjjg/201311/23864.html