哈夫曼(Huffman)樹構造和哈夫曼編碼

2021-08-20 11:29:53 字數 1602 閱讀 9723

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...