用C语言写,超时了,通过用例5/10。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXINT 32676
// 哈夫曼树每一个结点的类型
typedef struct HuffmanTreeNodeType {
int weight; // 权值
int parent, lchild, rchild; // 双亲、左孩子、有孩子的位置
} HuffmanTreeNodeType;
// 找最小的根结点和次小的根结点
void MinSubmin(HuffmanTreeNodeType* HuffmanTree, int len, int* min,
int* submin) {
int minval = MAXINT, subminval = MAXINT;
for (int i = 0; i <= len; i++) {
if (HuffmanTree[i].weight < minval && HuffmanTree[i].parent == 0) {
subminval = minval;
*submin = *min;
minval = HuffmanTree[i].weight;
*min = i;
} else if (HuffmanTree[i].weight < subminval && HuffmanTree[i].parent == 0) {
subminval = HuffmanTree[i].weight;
*submin = i;
}
}
}
// 创建哈夫曼树
void CreatHuffmanTree(HuffmanTreeNodeType** HuffmanTree, int n) {
// 先初始化数组,即哈夫曼树的初态
// 有n个结点,需要n-1次合并,共产生2n-1个结点
// 每一个结点的四个域均为0
(*HuffmanTree) = (HuffmanTreeNodeType*)malloc(sizeof(HuffmanTreeNodeType) *
(2 * n - 1));
for (int i = 0; i < 2 * n - 1; i++) {
(*HuffmanTree)[i].weight = 0;
(*HuffmanTree)[i].parent = 0;
(*HuffmanTree)[i].lchild = 0;
(*HuffmanTree)[i].rchild = 0;
}
// 输入前n个元素的weight
for (int i = 0; i < n; i++)
scanf("%d", &(*HuffmanTree)[i].weight);
// 构建哈夫曼树
int min, submin;
for (int i = n; i < 2 * n - 1; i++) {
MinSubmin((*HuffmanTree), i - 1, &min, &submin);
(*HuffmanTree)[i].lchild = min;
(*HuffmanTree)[i].rchild = submin;
(*HuffmanTree)[i].weight = (*HuffmanTree)[min].weight +
(*HuffmanTree)[submin].weight;
(*HuffmanTree)[min].parent = i;
(*HuffmanTree)[submin].parent = i;
}
}
// 构建哈夫曼编码
void CreatHuffmanCode(HuffmanTreeNodeType* HuffmanTree, char*** HuffmanCodeList,
int n) {
(*HuffmanCodeList) = (char**)malloc(sizeof(char*) * n);
char* code = (char*)malloc(sizeof(char) * n);
memset(code, '\0', n);
for (int i = 0; i < n; i++) {
int start = n - 1;
int cur = i;
int par = HuffmanTree[cur].parent;
while (par != 0) {
--start;
if (HuffmanTree[par].lchild == cur)
code[start] = '0';
else
code[start] = '1';
cur = par;
par = HuffmanTree[cur].parent;
}
(*HuffmanCodeList)[i] = (char*)malloc(sizeof(char) * (n - start));
strcpy((*HuffmanCodeList)[i], &code[start]);
}
free(code);
}
// 求哈夫曼编码的长度
int GetHuffmanCodeLength(HuffmanTreeNodeType* HuffmanTree,
char** HuffmanCodeList,
int n) {
int length = 0;
for (int i = 0; i < n; i++)
length += HuffmanTree[i].weight * strlen(HuffmanCodeList[i]);
return length;
}
int main(void) {
// 定义一棵哈夫曼树
HuffmanTreeNodeType* HuffmanTree;
// 定义结点个数
int n;
// 读入哈夫曼树的结点个数
scanf("%d", &n);
// 创建哈夫曼树
CreatHuffmanTree(&HuffmanTree, n);
// 构建哈夫曼编码
char** HuffmanCodeList;
CreatHuffmanCode(HuffmanTree, &HuffmanCodeList, n);
// 求哈夫曼编码的长度
int HuffmanCodeLength = GetHuffmanCodeLength(HuffmanTree, HuffmanCodeList, n);
printf("%d\n", HuffmanCodeLength);
return 0;
}



京公网安备 11010502036488号