数据结构哈夫曼树.docxVIP

  • 5
  • 0
  • 约2.82千字
  • 约 4页
  • 2020-08-31 发布于天津
  • 举报
数据结构实验报告 1?问题描述 已知n个字符在原文中出现的频率,求它们的哈夫曼编码 2?问题分析 求哈夫曼编码,首先要根据字符出现的频率,即权值,构建哈夫曼树,然后 根据哈夫曼树求出哈夫曼编码。 3.算法设计 创建哈夫曼树:对n个权值,创建2n-1个节点,pare nt都默认为0,然后 进行循环查找,每次循环都从所有节点中找出 pare nt为0且weight最小的 两个节点,序号分别为si和s2,将si节点和s2节点作为本节点的Ichild 和rchild,构建出一颗哈夫曼树,循环 2n-1次,最后只剩下一颗哈夫曼 树,即所要求的哈夫曼树。 哈夫曼编码:从叶子节点出发,寻找双亲节点,若没有则说明已经到根节 点;若有双亲节点,如果本节点是双亲节点的左孩子,则编码为 0,右孩子 编码为1,依次寻找直到走到根节点。最后将所求编码倒序输出即为哈夫曼 编码。 4.测试数据 测试数据为8个字符,权值分别为:5,29,7,8,14,23,3,11 测试结果: 请嚅入套编码的字符,以空格隔开 a b c d e F h 请输入要编码字符的权值,以空格帚开 5 29 7 a 1-1 23 3 11 赫夫曼编码为: a: 0010 b:18 c:0801 4:0G08 5?总结 建立哈夫曼树的时候,是逆向构建,即先创建叶节点,再创建根节点,从下往上 创建。求哈夫曼编码的时候也是一样,从叶子节点不断找该节点的根节点,直到找到 该哈夫曼树的根节点。 6?附录 #in elude iostream.h #i nclude malloc.h #in elude stri ng.h #defi ne ERROR 0 #defi ne OK 1 // 赫夫曼树和赫夫曼编码的存储表示 typedef struct{ un sig ned int weight; un sig ned int pare nt,lchild,rchild; }HTNode,* Huffma nTree; typedef char ** Huffma nCode; // 赫夫曼算法 void Select(HuffmanTree HT, int n, int min 1, int min2){ un sig ned int m1,m2; m1=m2=-1; //随意确定两个权值为最小 for(i nt i=1;i=n ;i++){ if(m2!=-1) break; if(HT[i].pare nt==O){ if(m 1==-1){ m仁 HT[i].weight; min 1=i; } else{ m2=HT[i].weight; mi n2=i; } } } //找最小权值 for(i nt k=1;k=n; k++){ if(HT[k].pare nt==O){ int w=HT[k].weight; if(k==min1 || k==min2) con ti nue; if(wm2){ m2=w; min 2=k; }else if(wm1){ m仁w; mi n仁k; } void Huffma nCodi ng(Huffma nTree HT, Huffma nCode HC, i nt *w, i nt n){ 〃w存放n个字符的权值(均0),构造赫夫曼树 HT,并求出n个字符的赫夫曼编 码HC if(n =1) return; int m = 2* n-1; HT = (Huffma nTree)malloc((m+1)*sizeof(HTNode));//0 号单元未用 int i; Huffma nTree p=HT; for(p++,i=1;i=n ;i++,p++,w++){ p-weight = *w; p-pare nt = 0; p-lchild = 0; p-rchild = 0; } for(;i=m;i++,p++){ p-weight = 0; p-pare nt = 0; p-lchild = 0; p-rchild = 0; } int s1,s2; for(i=n+1;i=m;i++){〃 建赫夫曼树 //在HT[1..i-1] 选择pare nt为0且weight最小的两个节点,其序号分别 为si和s2 Select(HT,i-1,s1,s2); HT[s1].pare nt = i; HT[s2].pare nt = i; HT[i].lchild = si; HT[i].rchild = s2; HT[i].weight = HT[s1].weight + HT[s2].weight; } //---- 从叶子到根逆向求每个字符的赫夫曼编码 ---- HC = (Huffma nCode)malloc(( n+1)*s

文档评论(0)

1亿VIP精品文档

相关文档