1、树与二叉树,Huffman编码,实现中需要用到的头文件,#include #include #include,Huffman树以及huffman编码的存储表示,typedef struct unsigned int weight; unsigned int parent,lchild,rchild; HTNode,*HuffmanTree; / 动态分配数组存储赫夫曼树 typedef char *HuffmanCode; / 动态分配数组存储赫夫曼编码表,select函数,void select(HuffmanTree t,int i,int ,void HuffmanCoding(Huff
2、manTree ,if (n=1) return; m = 2 * n - 1; HT = (HuffmanTree)malloc(m+1) * sizeof(HTNode); / 0号单元未用 for (i=1; i=n; i+) /初始化 HTi.weight=wi-1; HTi.parent=0; HTi.lchild=0; HTi.rchild=0; for (i=n+1; i=m; i+) /初始化 HTi.weight=0; HTi.parent=0; HTi.lchild=0; HTi.rchild=0; ,for (i=n+1; i=m; i+) / 建哈夫曼树 / 在HT1.
3、i-1中选择parent为0且weight最小的两个结点, / 其序号分别为s1和s2。 select(HT, i-1, s1, s2); HTs1.parent = i; HTs2.parent = i; HTi.lchild = s1; HTi.rchild = s2; HTi.weight = HTs1.weight + HTs2.weight; ,/- 从叶子到根逆向求每个字符的哈夫曼编码 - cd = (char *)malloc(n*sizeof(char); / 分配求编码的工作空间 cdn-1 = 0; / 编码结束符。 for (i=1; i=n; +i) / 逐个字符求哈夫曼编码 start = n-1; / 编码结束符位置 for (c=i, f=HTi.parent; f!=0; c=f, f=HTf.parent) / 从叶子到根逆向求编码 if (HTf.lchild=c) cd-start = 0; else cd-start = 1; HCi = (char *)malloc(n-start)*sizeof(char); / 为第i个字符编码分配空间 strcpy(HCi, / 释放工作空间 / HuffmanCoding,