目录
存储结构赫夫曼树创建赫夫曼编码
存储结构
typedef struct {
int weight
;
int parent
, lchild
, rchild
;
}HTNode
,*HuffManTree
;
typedef char* * HuffManCude
;
Status
min(HuffManTree
& HT
, int k
) {
int min_weight
;
int min
;
int i
= 1;
while (HT
[i
].parent
!= 0)
i
++;
min
= i
;
min_weight
= HT
[i
].weight
;
for (;i
< k
+ 1;i
++) {
if (HT
[i
].weight
< min_weight
&& HT
[i
].parent
== 0) {
min
= i
;
min_weight
= HT
[i
].weight
;
}
}
HT
[min
].parent
= 1;
return min
;
}
Status
min_2(HuffManTree
& HT
, int k
,int &min1
,int &min2
) {
min1
= min(HT
, k
);
min2
= min(HT
, k
);
return OK
;
}
赫夫曼树创建
根据n个权值 {w1, w2, ⋯,wn},构造成n棵二叉树的集合F={T1, T2, ⋯,Tn},其中每棵二叉树只有一个权值为wi的根结点,没有左、右子树;在F中选取两棵根结点权值最小的树作为左、右子树构造一棵新的二叉树,且新的二叉树根结点权值为其左、右子树根结点的权值之和;在F中删除这两棵树,同时将新得到的树加入F中;重复2、3,直到F只含一颗树为止。
Status
CreatHuffManTree(HuffManTree
& HT
, int *w
,int n
) {
int m
= 2 * n
- 1;
HT
= (HuffManTree
)malloc((m
+1) * sizeof(HTNode
));
HuffManTree p
;
int i
;
for ( i
= 1;i
< n
+ 1;++i
) {
w
++;
HT
[i
] = { *w
,0,0,0 };
}
for (;i
< m
+ 1;++i
) {
HT
[i
] = { 0,0,0,0 };
}
int s1
, s2
;
for (int i
= n
+ 1;i
< m
+ 1;i
++) {
min_2(HT
, i
- 1, s1
, s2
);
HT
[s1
].parent
= HT
[s2
].parent
= i
;
HT
[i
].lchild
= s1
;HT
[i
].rchild
= s2
;
HT
[i
].weight
= HT
[s1
].weight
+ HT
[s2
].weight
;
}
return OK
;
}
赫夫曼编码
Status
HuffManCoding(HuffManTree HT
, HuffManCude
& HC
,int n
) {
HC
= (HuffManCude
)malloc((n
+1) * sizeof(char*));
char* cd
= (char*)malloc(n
* sizeof(char));
cd
[n
- 1] = '\0';
int start
= 0;
for (int i
= 1;i
< n
+ 1;++i
) {
start
= n
- 1;
for (int c
= i
, f
= HT
[i
].parent
;f
!= 0;c
= f
, f
= HT
[f
].parent
) {
if (HT
[f
].lchild
== c
) cd
[--start
] = '0';
else cd
[--start
] = '1';
}
HC
[i
] = (char*)malloc((n
- start
) * sizeof(char));
strcpy(HC
[i
], &cd
[start
]);
}
free(cd
);
return OK
;
}
完整代码