#include
#include
using namespace std;
#define maxsize 10
typedef
int elemtype;
typedef
struct btreenode
btreenode;
//根據陣列 a 中 n 個權值建立一棵哈夫曼樹,返回樹根指標
btreenode*
createhuffman
(elemtype a,
int n)
for(
int i =
1; i < n; i++
)//進行 n-1 次迴圈建立哈夫曼樹
if(b[j]
!=null)}
for(
int j = k2; j < n; j++
)//從當前森林中求出最小權值樹和次最小//從k2開始:先比較k1和k2
else
if(b[j]
->data < b[k2]
->data)
k2 = j;}}
//由最小權值樹和次最小權值樹建立一棵新樹,q指向樹根結點
q =(btreenode*
)malloc
(sizeof
( btreenode));
q->data = b[k1]
->data + b[k2]
->data;
q->left = b[k1]
; q->right = b[k2];
b[k1]
= q;
//將指向新樹的指標賦給b指標陣列中k1位置
b[k2]
=null
;//k2位置為空
}free
(b);
//刪除動態建立的陣列b
return q;
//返回整個哈夫曼樹的樹根指標
}//3、求哈夫曼樹的帶權路徑長度
elemtype weightpathlength
(struct btreenode* fbt,
int len)
//len初始為0
}void
disptree
(btreenode* b)
for(i =
1; i <= n; i++
)printf
(" ");
printf
("%d(%s)\n"
,p->data,type)
; top--;if
(p->right !=
null)if
(p->left !=
null)}
}}//主函式
intmain
(void
)
給定權值,哈弗曼編碼 解碼
假設某通訊報文的字符集由a,b,c,d,e,f這6個字元組成,它們在報文 現的頻度 頻度均為整數值 1 構造一棵哈弗曼樹,依次給出各字元編碼結果。2 給字串進行編碼。3 給編碼串進行解碼。構建哈弗曼樹時 左子樹根結點權值小於等於右子樹根結點權值。生成編碼時 左分支標0,右分支標1。第一行 依次輸入6...
哈弗曼編碼 哈弗曼樹
哈弗曼編碼是依賴於字元使用頻率來建立的一種編碼,通過把使用頻率低的字元分配相對較多的01編碼,而使用頻率高的分配相對較低的01編碼,來建立最小的帶權路徑長度的樹,來最大化的獲得編碼儲存空間的一種編碼規則。這個樹稱為哈弗曼樹,也稱為最優二叉樹。這樣可以確定每乙個字元的編碼不可能成為其他字元編碼的坐子串...
求哈夫曼樹的權值
哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出權值。5 1 2 2 ...