哈夫曼编码步骤.pdfVIP

  • 50
  • 0
  • 约1.21万字
  • 约 10页
  • 2020-08-15 发布于广东
  • 举报
哈夫曼编码步骤: 一、对给定的n 个权值{W1,W2,W3,...,Wi,...,Wn}构成n 棵二叉树的初始集合F= {T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti 中只有一个权值为Wi 的根结点,它的左右子树均为空。(为 方便在计算机上实现算 法,一般还要求以Ti 的权值Wi 的升序排列。) 二、在F 中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其 左右子树的根结点的权值之和。 三、从F 中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F 中。 四、重复二和三两步,直到集合F 中只有一棵二叉树为止。 /* * Name: 哈夫曼编码源代码。 * Date: 2011.04.16 * Author: Jeffrey Hill+Jezze(解码部分) * 在 Win-TC 下测试通过 * 实现过程:着先通过 HuffmanTree() 函数构造哈夫曼树,然后在主函数 main() 中 * 自底向上开始(也就是从数组序号为零的结点开始) 向上层层判断,若在 * 父结点左侧,则置码为 0,若在右侧,则置码为 1。最后输出生成的编码。 * */ #include stdio.h #includestdlib.h #define MAXBIT 100 #define MAXVALUE 10000 #define MAXLEAF 30 #define MAXNODE MAXLEAF*2 - 1 typedef struct { int bit[MAXBIT]; int start;} HCodeType; /* 编码结构体 */ typedef struct{ int weight; int parent; int lchild; int rchild; int value;} HNodeType; /* 结点结构体 */ /* 构造一颗哈夫曼树 */ void HuffmanTree (HNodeType HuffNode[MAXNODE], int n){ /* i 、j : 循环变量,m1 、m2 :构造哈夫曼树不同过程中两个最小权值结点的权值, x1 、x2 :构造哈夫曼树不同过程中两个最小权值结点在数组中的序号。*/ int i, j, m1, m2, x1, x2; /* 初始化存放哈夫曼树数组 HuffNode[] 中的结点 */ for (i=0; i2*n- 1; i++) { HuffNode[i].weight = 0;//权值 HuffNode[i].parent =- 1; HuffNode[i].lchild =- 1; 1 HuffNode[i].rchild =- 1; HuffNode[i].value=i; //实际值,可根据情况替换为字母 } /* end for */ /* 输入 n 个叶子结点的权值 */ for (i=0; in; i++) { printf (Please input weight of leaf node %d: \n, i); scanf (%d, HuffNode[i].weight); } /* end for */ /* 循环构造 Huffman 树 */ for (i=0; in- 1; i++) { m1=m2=MAXVALUE; /* m1 、m2 中存放两个无父结点且结点权值最小的两个结点 */ x1=x2=0; /* 找出所有结点中权值最小、无父结点的两个结点,并合并之为一颗二叉树 */ for (j=0; jn+i; j++) { if (HuffNode[j].weight m1 HuffNod

文档评论(0)

1亿VIP精品文档

相关文档