哈夫曼树也称最优二叉树,顾名思义,即所有叶子结点的带权路径长度最短。对数据进行哈夫曼编码,可以大大减少数据传输量。
1.设计Huffman Tree的结点结构,即Huffman Node,并创建Huffman Node
//huffman节点结构
typedef struct _HUFFMAN_NODE{
char str; //需编译的字符
double frequence; //字符出现频率
int symbol; //该节点的编码
_HUFFMAN_NODE *left;
_HUFFMAN_NODE *right;
_HUFFMAN_NODE *parent;
}HUFFMAN_NODE;
//创建HUFFMAN_NODE
HUFFMAN_NODE *creat_huffman_node(char str,double frq)
{
HUFFMAN_NODE *pNode;
pNode=(HUFFMAN_NODE *)malloc(sizeof(HUFFMAN_NODE));
assert(NULL!=pNode);
pNode->str = str;
pNode->frequence = frq;
pNode->left = NULL;
pNode->right = NULL;
pNode->parent = NULL;
pNode->symbol = -1;
return pNode;
}
//创建huffman_Tree
HUFFMAN_NODE *creat_huffman_tree(HUFFMAN_NODE *array[],int len)
{
HUFFMAN_NODE *root;
while(len>1){
root=(HUFFMAN_NODE *)malloc(sizeof(HUFFMAN_NODE));
assert(NULL!=root);
bubble_sort(array,len);
root->left = array[0];
root->right = array[1];
root->frequence = array[0]->frequence + array[1]->frequence;
array[0]->symbol = 1;
array[0]->parent = root;
array[1]->symbol = 0;
array[1]->parent = root;
memmove(&array[0],&array[2],sizeof(HUFFMAN_NODE *)*(len-2));
array[len-2]=root;
len--;
}
return root;
}
//输出huffman_code
void print_huffman_code(HUFFMAN_NODE *pNode,HUFFMAN_NODE *root)
{
assert(NULL!=root);
printf("%c: %f ",pNode->str,pNode->frequence);
while(pNode!=root){
printf("%d",pNode->symbol);
pNode=pNode->parent;
}
printf("\n");
}
其中bubble_sort()的函数原型如下:
int compare(void *a,void *b)
{
HUFFMAN_NODE *node1=(HUFFMAN_NODE *)a;
HUFFMAN_NODE *node2=(HUFFMAN_NODE *)b;
return node1->frequence>node2->frequence?1:0;
}
void swap(HUFFMAN_NODE **a,HUFFMAN_NODE **b)
{
HUFFMAN_NODE *tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
void bubble_sort(HUFFMAN_NODE *array[],int len)
{
int inner,outer;
for(outer=0;outer<len-1;outer++){
for(inner=0;inner<=outer;inner++)
if(compare(array[inner],array[inner+1]))
swap(&array[inner],&array[inner+1]);
}
}