n個權值,則構造出的哈夫曼樹有
n個葉子結點。
n個權值分別設為
w1,w2,…,wn,
則哈夫曼樹的構造規則為:
(1)
根據給定的
n個權值構成n
棵二叉樹的集合
f=(2)
每次選擇兩個權值最小的二叉樹做子樹合併為乙個新的二叉樹,新二叉樹的權值為兩個子樹的和。直到森林中只剩一棵樹為止,該樹即為我們所求得的哈夫曼樹。
在資料通訊中,需要將傳送的文字轉換成二進位制的字串,用
0,1碼的不同排列來表示字元。例如,需傳送的報文為「after
dataear are art area
」,這裡用到的字符集為「a,e,r,t
,f,d」,各字母出現的次數為。現要求為這些字母設計哈夫曼編碼。(既滿足字首編碼的條件,又保證
報文編碼總長最短。)
建哈夫曼樹的主要思路:1)初始化 2)找到兩個最小值,儲存其下標
編碼的主要思路:1)當
k有父結點
沿著父結點
往上搜尋 2)若k是
p的左孩子 用新陣列儲存 並令其為0,反之令其為1 3)末尾加字串結束標誌:
str[
i] = 『\0』 4)最後記得逆序
#include
#include
#include
#define max 10000
char str[20], str2[20];
typedef struct
node, *huffmantree;
//解碼
char *getcode(huffmantree ht, int index, int n)
if(ht[j].rchild== k)
}str[t] = str2[t] = '\0';
for(i = t-1,j = 0; i != -1; i--,j++)
return str2;
}//找兩個最小的權值,並儲存其下標
void select1(huffmantree ht, int n, int *s1, int *s2)
else if(ht[i].weight < min2)}}
}//建立哈夫曼樹
void crthuffmantree(huffmantree ht, int w, char s, int n)
for(i = n; i < m; i++)
for(i = n; i < m; i++)
printf("根據建立的哈夫曼樹得到字元對應編碼如下:\n");
for(i = 0; i < n; i++)
// setbuf(stdin,0);
getchar();
printf("請輸入要編碼的字串:");
while((ch = getchar()) != '\n')}}
printf("\n");
}int main()
crthuffmantree(ht, w, s, n);
printf("請輸出哈夫曼樹\n");
for(i = 0; i < 2*n-1; i++)
return 0;
}
哈夫曼樹(huffman)
學完了huffman樹,講一下自己對它的理解 圖二public class huffmantree override public int compareto nonnull treenodeo else if this.weight o.weight return 0 傳乙個陣列進來 建立哈夫曼樹...
Huffman樹(哈夫曼樹)
哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度 若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數 樹的帶權路徑長度記為wpl w1 l1 w2 l2 w3 l3 wn ln n個權值wi i 1,2,n 構成一棵...
構造哈夫曼樹 哈夫曼編碼
1.權值越大的節點,距離根越近 2.樹中沒有度為1的節點,這類樹叫正則 嚴格 二叉樹,樹的總節點 2 雙分支結點 1 單分支結點 雙分支結點 3.樹的帶權路勁 wpl 所有葉子結點的帶權長度路勁之和 長度最短。嗶哩嗶哩王卓老師的口訣 構造森林全是根,選用兩小選新樹,刪除兩小添新人,重複23剩單根 1...