一顆有n個葉子結點的赫夫曼樹共有2*n-1,可以儲存在乙個一維陣列中。編碼時候需要從葉子到根的路徑。故對每乙個結點而言,需要知道雙親的資訊和孩子的資訊。故利用以下儲存結構
typedef struct
htnode,*huffmantree;//動態分配陣列儲存赫夫曼樹
赫夫曼樹的構造演算法:
1.每次從樹的集合中選取兩顆根結點的權值最小的樹作為左右子樹構造一顆新的二叉樹,其權值為左右子樹的權值之和。
2.從樹的集合中刪除這兩棵樹,並將新合併的二叉樹放入其中
3.重複1、2,直到之含一棵樹為止。
從樹的集合中選取兩顆根結點的權值最小的樹的實現
void
select(huffmantree
ht,int
n,int
&s1,int
&s2)
}
}
if(ht[s1].weight>ht[s2].weight)
for(i+=1;i<=n;i++)
else
if(ht[i].weight
weight)
}
}
}赫夫曼樹的構造和編碼
void huffmancoding(huffmantree &ht,huffmancode &hc,int *w,int n)
for (i=n+1; i<=m; i++)
int s1,s2;
//構造赫夫曼樹
for(i=n+1;i<=m;i++)
//赫夫曼編碼
hc = (huffmancode)malloc((n+1)*sizeof(char *));
int c,f,start;
char *cd;
cd = (char *)malloc(n*sizeof(char)); // 分配求編碼的工作空間
cd[n-1] = '\0'; // 編碼結束符。
for (i=1; i<=n; ++i)
free(cd); // 釋放工作空間
}
// 輸出哈夫曼樹各節點的狀態
void print(huffmantree ht)
}
//遞迴來計算wpl值
int huffmantreewpl_(huffmantree ht, int i, int deepth)
else//否則向下遞迴
}
赫夫曼程式設計C語言實現
問題描述 利用huffman編碼進行通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳資料預先編碼,在接受端將傳來的資料編碼進行解碼 復原 對於有些通道,每端都需要乙個完整的編 解碼系統。試為這樣的資訊收發站編寫乙個huffman的編 解碼系統。給...
赫夫曼樹 C 實現
赫夫曼樹,即最優二叉樹。給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。構造赫夫曼樹 1.把節點的權值按從小到大的順序排列。2.從序列中取出前兩個...
赫夫曼樹簡單實現
給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。權值可以看作節點中存放的值,路徑長度即為該葉子節點所處的層數減去1。其中 路徑長度 節點權值 相加...