Huffman编码:根据Huffman树进行编码的,用到的数据结构是二叉树。
typedef int elemtype; typedef struct { elemtype weight; int parent,l_child,r_child; } binarytree; //2、构建最优二叉树 void CreateHuffman(int leafnum, binarytree *huffmantree) { //leafnum个叶子,决定nodenum个结点数 int nodenum=2*leafnum-1; huffmantree=(binarytree *)malloc(nodenum*sizeof(binarytree)); //0号单元也使用 //leafnum个叶子,决定nodenum个结点数,也决定了(nodenum-1)个bit位编码 char *huffmancode; huffmancode =(char *)malloc((nodenum-1)*sizeof(char)); //huffmantree的初始化:叶子结点data权值手动输入,非叶子默认值都为0 cout<<"请输入叶子权值:"; int i; for(i=0;i<nodenum;i++) { if(i<leafnum) { cin>>huffmantree[i].weight; } else { huffmantree[i].weight=0; } huffmantree[i].parent=huffmantree[i].l_child=huffmantree[i].r_child=0; } int j; //j从leafnum开始,指的是包含了新建子树的结点编号 for(j=leafnum;j<nodenum;j++) { int w1=32767,w2=0; //存储最小权值; int p=0,q=0; //存储最小权值的编号; int k; for(k=0;k<j;k++) { if(huffmantree[k].parent==0) //判断结点是否使用 { if(huffmantree[k].weight<w1) { w2=w1; q=p; w1=huffmantree[k].weight; p=k; } else if(huffmantree[k].weight<w2) { w2=huffmantree[k].weight; q=k; } } } //p对应左节点,编码为‘0’;q对应左节点,编码为‘1’; huffmancode[p]='0'; huffmancode[q]='1'; huffmantree[j].weight =w1+w2; huffmantree[j].l_child=p; huffmantree[j].r_child=q; huffmantree[p].parent=j; huffmantree[q].parent=j; } //3、寻找从子节点到根节点的编码 HuffmanCoding(int n,binarytree *HuffmanTree) //针对每一个叶子,从叶子到根方向寻找huffmancode //每一个叶子,对应的编码长度codelength const int maxsize=10; char iscode[maxsize][maxsize]; int m; for(m=0;m<leafnum;m++) //从第一个叶子开始找 { int n=0; iscode[m][n]=huffmancode[m]; int parent=huffmantree[m].parent; while(parent !=0) { iscode[m][++n]=huffmancode[parent]; parent=huffmantree[parent].parent; }; int x; cout<<"第"<<m+1<<"个叶子的HuffmanCode————"; for(x=0;x<n;x++) cout<<iscode[m][x]; cout<<endl; } } void main() { binarytree *T=0; int leafnum; printf("输入叶子数量n=\n"); cin>>leafnum; CreateHuffman( leafnum, T); while(1); }
编译结果如下:
Huffman编码C实现
时间: 2024-10-03 08:14:46