//哈夫曼樹結點結構
huffnode;
typedef
struct
huffcode;
void
select
(huffnode hufftree,
int k,
int& i1,
int& i2)
for(j = i +
1; j < k; j++)if
(hufftree[j]
.parent ==-1
)for
(i =
0; i < k; i++)if
((hufftree[i]
.parent ==-1
)&&(hufftree[i]
.weight < hufftree[i1]
.weight)
&&(i2 != i)
)for
(j =
0; j < k; j++)if
((hufftree[j]
.parent ==-1
)&&(hufftree[j]
.weight < hufftree[i2]
.weight)
&&(i1 != j))}
void
huffmantree
(huffnode hufftree,
int n)
#if 0
for(k = n; k <
2* n -
1; k++
)#else
//優化演算法
/* // 基本思想:先排序,然後每次前面在順序取權值,k+1和後面新增的比較,
// 如果前面k+1比後面小,取前面k 和 k+1,且取完相加等到新的 i_12,
// 如果後面的比k+1小,則取k 和 後面的 i_12-1 相加得到新的i_12
1. 排序
2. 依次選2個相加得到最小權值
2.1 判斷k++是否 大於等於n,如果是則退出
*/// 排序
huffnode temp;
for(
int i =
0; i < n -1;
++i)}}
int i1, i2;
// i1, i2 之和的下標
int i_12 = n -1;
for(k =
0; k < n ; k++
)else}}
hufftree[i_12]
.weight = hufftree[i1]
.weight + hufftree[i2]
.weight;
hufftree[i1]
.parent = i_12; hufftree[i2]
.parent = i_12;
hufftree[i_12]
.lchild = i1; hufftree[i_12]
.rchild = i2;
}#endif
}char
*strcut
(char
* dest,
char
* src,
int start)}}
else
return dest;
}void
encoding
(huffnode ht[
], huffcode hcd,
int n)
//hcd[i] = strcpy(hcd[i].cd, &cd[start])
char
* dest = new char
[n - hcd[i]
.start]
; dest =
strcut
(dest, hcd[i]
.cd, hcd[i]
.start)
; cout << ht[i]
.data <<
": "
<< dest << endl;}}
intmain()
huffmantree
(hufftree, n)
;//構造哈夫曼樹
encoding
(hufftree, hcd, n)
;//求得哈夫曼樹hufftree的對應的哈夫曼編碼,並輸出每個葉子結點的哈夫曼編碼
return0;
}
哈夫曼樹與哈夫曼編碼
在一般的資料結構的書中,樹的那章後面,著者一般都會介紹一下哈夫曼 huffman 樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的乙個應用。哈夫曼編碼應用廣泛,如 jpeg中就應用了哈夫曼編碼。首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的...
哈夫曼樹與哈夫曼編碼
1.哈夫曼 huffman 編碼是哈夫曼樹的乙個應用。2.哈夫曼樹又稱為最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的相對值乘上其到根結點的路徑和權值。3.影象jpg就是利用了哈夫曼編碼。4.哈夫曼樹是最優二叉樹,子樹有左右次序之分。5.哈夫曼樹的形態不是唯...
哈夫曼樹與哈夫曼編碼
哈夫曼樹是一種簡單的樹結構,建樹過程如下 給出一組資料,不斷選擇最小的兩個數,並用兩個數的和作為它們的parent節點,再從資料中刪除這兩個數,將兩個數的和加入資料中,直到所有的資料都被加入樹結構,形成一顆樹。這顆樹的所有非葉子節點都有兩個child,兩個child的值的和則是這個節點的值,根節點是...