哈夫曼树 哈夫曼编码(先序遍历方法)

合集下载

树的遍历和哈夫曼树

树的遍历和哈夫曼树
}
2021/4/18 北京化工大学信息学院 数据结构 33
求二叉树高度的递归算法
int Height ( BinTreeNode * T ) { if ( T == NULL ) return -1; else { int m = Height ( T->leftChild ); int n = Height ( T->rightChild ) ); return (m > n) ? m+1 : n+1;
中序遍历 (Inorder Traversal)
中序遍历二叉树算法的框架是:
若二叉树为空,则空操作;
-
否则 中序遍历左子树 (L);
+
/
访问根结点 (V);
a *e f
中序遍历右子树 (R)。
遍历结果
b-
a+b*c-d-e/f
cd
2021/4/18 北京化工大学信息学院 数据结构 20
二叉树递归的中序遍历算法
如果 n = 0,称为空树;如果 n > 0,则 ▪ 有一个特定的称之为根(root)的结点,
它只有直接后继,但没有直接前驱; ▪ 除根以外的其它结点划分为 m (m 0)
个 互不相交的有限集合T0, T1, …, Tm-1,每 个集合又是一棵树,并且称之为根的子树。
2021/4/18 北京化工大学信息学院 数据结构 3
typedef struct node { //树结点定义
TreeData data;
//结点数据域
struct node * leftChild, * rightchild;
//子女指针域
} BinTreeNode;
typedef BinTreeNode * BinTree; //树定义,代表树的根指针

最优二叉树(哈夫曼树)的构建及编码

最优二叉树(哈夫曼树)的构建及编码

最优⼆叉树(哈夫曼树)的构建及编码参考:数据结构教程(第五版)李春葆主编⼀,概述1,概念 结点的带权路径长度: 从根节点到该结点之间的路径长度与该结点上权的乘积。

树的带权路径长度: 树中所有叶结点的带权路径长度之和。

2,哈夫曼树(Huffman Tree) 给定 n 个权值作为 n 个叶⼦结点,构造⼀棵⼆叉树,若该树的带权路径长度达到最⼩,则称这样的⼆叉树为最优⼆叉树,也称为哈夫曼树。

哈夫曼树是带权路径长度最短的树,权值较⼤的结点离根较近。

⼆,哈夫曼树的构建1,思考 要实现哈夫曼树⾸先有个问题摆在眼前,那就是哈夫曼树⽤什么数据结构表⽰? ⾸先,我们想到的肯定数组了,因为数组是最简单和⽅便的。

⽤数组表⽰⼆叉树有两种⽅法: 第⼀种适⽤于所有的树。

即利⽤树的每个结点最多只有⼀个⽗节点这种特性,⽤ p[ i ] 表⽰ i 结点的根节点,进⽽表⽰树的⽅法。

但这种⽅法是有缺陷的,权重的值需要另设⼀个数组表⽰;每次找⼦节点都要遍历⼀遍数组,⼗分浪费时间。

第⼆种只适⽤于⼆叉树。

即利⽤⼆叉树每个结点最多只有两个⼦节点的特点。

从下标 0 开始表⽰根节点,编号为 i 结点即为 2 * i + 1 和 2 * i + 2,⽗节点为 ( i - 1) / 2,没有⽤到的空间⽤ -1 表⽰。

但这种⽅法也有问题,即哈夫曼树是从叶结点⾃下往上构建的,⼀开始树叶的位置会因为⽆法确定⾃⾝的深度⽽⽆法确定,从⽽⽆法构造。

既然如此,只能⽤⽐较⿇烦的结构体数组表⽰⼆叉树了。

typedef struct HTNode // 哈夫曼树结点{double w; // 权重int p, lc, rc;}htn;2,算法思想 感觉⽐较偏向于贪⼼,权重最⼩的叶⼦节点要离根节点越远,⼜因为我们是从叶⼦结点开始构造最优树的,所以肯定是从最远的结点开始构造,即权重最⼩的结点开始构造。

所以先选择权重最⼩的两个结点,构造⼀棵⼩⼆叉树。

然后那两个最⼩权值的结点因为已经构造完了,不会在⽤了,就不去考虑它了,将新⽣成的根节点作为新的叶⼦节加⼊剩下的叶⼦节点,⼜因为该根节点要能代表整个以它为根节点的⼆叉树的权重,所以其权值要为其所有⼦节点的权重之和。

c语言 哈夫曼树哈夫曼编码

c语言 哈夫曼树哈夫曼编码

c语言哈夫曼树哈夫曼编码哈夫曼树(Huffman Tree)和哈夫曼编码(Huffman Coding)是由戴维·哈夫曼在1952年为数据压缩应用而发明的。

哈夫曼编码是一种前缀编码,即任何字符的编码都不是另一个字符的编码的前缀。

在编码学中,哈夫曼编码是一种可变长度编码,其中较常见或较频繁的字符使用较短的编码,而较少见或较不频繁的字符使用较长的编码。

这种编码是由哈夫曼树生成的,哈夫曼树是一种特殊的二叉树,其每个节点的权重等于其左子树和右子树的权重之和。

在C语言中实现哈夫曼树和哈夫曼编码可能涉及以下步骤:1、定义哈夫曼树的节点结构。

每个节点可能包括字符,权重(或频率),以及左孩子和右孩子的指针。

ctypedef struct huffman_node {char character;unsigned int frequency;struct huffman_node *left, *right;} huffman_node;2、创建哈夫曼树。

首先,你需要计算每个字符的频率,然后根据这些频率创建一个哈夫曼树。

这个过程可能涉及使用优先队列(最小堆)来找出频率最小的两个节点,然后将它们合并为一个新的节点,新节点的频率是这两个节点的频率之和。

然后,将新节点放回队列中,重复这个过程直到队列中只剩下一个节点,这个节点就是你的哈夫曼树的根节点。

3、使用哈夫曼树生成哈夫曼编码。

从根节点开始,对于每个字符,左子树代表0,右子树代表1。

你可以遍历哈夫曼树,为每个字符生成其对应的哈夫曼编码。

4、实现解码。

给定一个哈夫曼编码,你可以通过遍历哈夫曼树来解码它。

对于每个位,如果是0,你跟随左子树,如果是1,你跟随右子树。

当你到达一个叶节点时,你就找到了对应的字符。

以上只是一个大致的步骤,具体的实现可能会根据你的需求和具体情况有所不同。

c语言哈夫曼树的构造及编码

c语言哈夫曼树的构造及编码

c语言哈夫曼树的构造及编码一、哈夫曼树概述哈夫曼树是一种特殊的二叉树,它的构建基于贪心算法。

它的主要应用是在数据压缩和编码中,可以将频率高的字符用较短的编码表示,从而减小数据存储和传输时所需的空间和时间。

二、哈夫曼树的构造1. 哈夫曼树的定义哈夫曼树是一棵带权路径长度最短的二叉树。

带权路径长度是指所有叶子节点到根节点之间路径长度与其权值乘积之和。

2. 构造步骤(1) 将待编码字符按照出现频率从小到大排序。

(2) 取出两个权值最小的节点作为左右子节点,构建一棵新的二叉树。

(3) 将新构建的二叉树加入到原来排序后队列中。

(4) 重复上述步骤,直到队列只剩下一个节点,该节点即为哈夫曼树的根节点。

3. C语言代码实现以下代码实现了一个简单版哈夫曼树构造函数:```ctypedef struct TreeNode {int weight; // 权重值struct TreeNode *leftChild; // 左子节点指针struct TreeNode *rightChild; // 右子节点指针} TreeNode;// 构造哈夫曼树函数TreeNode* createHuffmanTree(int* weights, int n) {// 根据权值数组构建节点队列,每个节点都是一棵单独的二叉树TreeNode** nodes = (TreeNode**)malloc(sizeof(TreeNode*) * n);for (int i = 0; i < n; i++) {nodes[i] = (TreeNode*)malloc(sizeof(TreeNode));nodes[i]->weight = weights[i];nodes[i]->leftChild = NULL;nodes[i]->rightChild = NULL;}// 构建哈夫曼树while (n > 1) {int minIndex1 = -1, minIndex2 = -1;for (int i = 0; i < n; i++) {if (nodes[i] != NULL) {if (minIndex1 == -1 || nodes[i]->weight < nodes[minIndex1]->weight) {minIndex2 = minIndex1;minIndex1 = i;} else if (minIndex2 == -1 || nodes[i]->weight < nodes[minIndex2]->weight) {minIndex2 = i;}}}TreeNode* newNode =(TreeNode*)malloc(sizeof(TreeNode));newNode->weight = nodes[minIndex1]->weight + nodes[minIndex2]->weight;newNode->leftChild = nodes[minIndex1];newNode->rightChild = nodes[minIndex2];// 将新构建的二叉树加入到原来排序后队列中nodes[minIndex1] = newNode;nodes[minIndex2] = NULL;n--;}return nodes[minIndex1];}```三、哈夫曼编码1. 哈夫曼编码的定义哈夫曼编码是一种前缀编码方式,它将每个字符的编码表示为二进制串。

哈夫曼树和哈夫曼编码(数据结构程序设计)

哈夫曼树和哈夫曼编码(数据结构程序设计)

课程设计(数据结构)哈夫曼树和哈夫曼编码二○○九年六月二十六日课程设计任务书及成绩评定课题名称表达式求值哈夫曼树和哈夫曼编码Ⅰ、题目的目的和要求:巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解,最终使学生能够熟练应用数据结构的知识写程序。

(1)通过本课程的学习,能熟练掌握几种基本数据结构的基本操作。

(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。

Ⅱ、设计进度及完成情况Ⅲ、主要参考文献及资料[1] 严蔚敏数据结构(C语言版)清华大学出版社 1999[2] 严蔚敏数据结构题集(C语言版)清华大学出版社 1999[3] 谭浩强 C语言程序设计清华大学出版社[4] 与所用编程环境相配套的C语言或C++相关的资料Ⅳ、成绩评定:设计成绩:(教师填写)指导老师:(签字)二○○九年六月二十六日目录第一章概述 (1)第二章系统分析 (2)第三章概要设计 (3)第四章详细设计及实现代码 (8)第五章调试过程中的问题及系统测试情况 (12)第六章结束语 (13)参考文献 (13)第一章概述课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。

课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。

《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。

数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

在这次的课程设计中我选择的题目是表达式求值和哈夫曼树及哈夫曼编码。

这里我们介绍一种简单直观、广为使用的算法,通常称为“算符优先法”。

哈夫曼树又称最优树,是一类带权路径长度最短的树,有着广泛的应用。

哈夫曼树的编码和解码

哈夫曼树的编码和解码

哈夫曼树的编码和解码是哈夫曼编码算法的重要部分,下面简要介绍其步骤:
1. 编码:
哈夫曼编码是一种变长编码方式,对于出现频率高的字符使用较短的编码,而对于出现频率低的字符使用较长的编码。

具体步骤如下:(1)根据字符出现的频率,构建哈夫曼树。

频率相同的字符,按照它们在文件中的出现顺序排列。

(2)从哈夫曼树的叶子节点开始,从下往上逐步进行编码。

对于每个节点,如果该节点有左孩子,那么左孩子的字符编码为0,右孩子的字符编码为1。

如果该节点是叶子节点,则该节点的字符就是它的编码。

(3)对于哈夫曼树中的每个节点,都记录下它的左孩子和右孩子的位置,以便后续的解码操作。

2. 解码:
解码过程与编码过程相反,具体步骤如下:
(1)从哈夫曼树的根节点开始,沿着路径向下遍历树,直到找到一个终止节点(叶节点)。

(2)根据终止节点的位置信息,找到对应的字符。

(3)重复上述步骤,直到遍历完整个编码序列。

需要注意的是,哈夫曼编码是一种无损压缩算法,解压缩后的数据与原始数据完全相同。

此外,由于哈夫曼编码是一种变长编码方式,因此在解码时需要从根节点开始逐个解码,直到解码完成。

哈夫曼树及哈夫曼编码的程序-附流程图(下)

哈夫曼树及哈夫曼编码的程序-附流程图(下)

哈夫曼树及哈夫曼编码的程序-附流程图(下)int m,s1,s2;typedef struct {unsigned int weight;unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char *HuffmanCode;void Select(HuffmanTree HT,int n) {int i,j;for(i = 1;i <= n;i++)if(!HT[i].parent){s1 = i;break;}for(j = i+1;j <= n;j++)if(!HT[j].parent){s2 = j;break;}for(i = 1;i <= n;i++)if((HT[s1].weight>HT[i].weight)&&(!HT[i].parent)&&(s2!=i))s1=i;for(j = 1;j <= n;j++)if((HT[s2].weight>HT[j].weight)&&(!HT[j].parent)&&(s1!=j))s2=j;}void HuffmanCoding(HuffmanTree &HT, HuffmanCode HC[], int *w, int n) {int i, j;char *cd;int p;int cdlen;if (n<=1) return;m = 2 * n - 1;HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode));for (i=1; i<=n; i++) {HT[i].weight=w[i-1];HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;}for (i=n+1; i<=m; i++) {HT[i].weight=0;HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;}puts("\n哈夫曼树的构造过程如下所⽰:");printf("HT初态:\n 结点 weight parent lchild rchild");for (i=1; i<=m; i++)printf("\n%4d%8d%8d%8d%8d",i,HT[i].weight,HT[i].parent,HT[i].lchild, HT[i].rchild);printf(" 按任意键,继续 ...");getchar();for (i=n+1; i<=m; i++) {Select(HT, i-1);HT[s1].parent = i; HT[s2].parent = i;HT[i].lchild = s1; HT[i].rchild = s2;HT[i].weight = HT[s1].weight + HT[s2].weight;printf("\nselect: s1=%d s2=%d\n", s1, s2);printf(" 结点 weight parent lchild rchild");for (j=1; j<=i; j++)printf("\n%4d%8d%8d%8d%8d",j,HT[j].weight,HT[j].parent,HT[j].lchild, HT[j].rchild);printf(" 按任意键,继续 ...");getchar(); }cd = (char *)malloc(n*sizeof(char));p = m; cdlen = 0;for (i=1; i<=m; ++i)HT[i].weight = 0;while (p) {if (HT[p].weight==0) {HT[p].weight = 1;if (HT[p].lchild != 0) { p = HT[p].lchild; cd[cdlen++] ='0'; } else if (HT[p].rchild == 0){ HC[p] = (char *)malloc((cdlen+1) * sizeof(char));cd[cdlen] ='\0'; strcpy(HC[p], cd); }}else if (HT[p].weight==1){ HT[p].weight = 2;if (HT[p].rchild != 0) { p = HT[p].rchild; cd[cdlen++] ='1'; }} else { // HT[p].weight==2,HT[p].weight = 0; p = HT[p].parent; --cdlen; } }}void main() {HuffmanTree HT;HuffmanCode *HC;int *w,n,i;puts("输⼊结点数:");scanf("%d",&n);HC = (HuffmanCode *)malloc(n*sizeof(HuffmanCode));w = (int *)malloc(n*sizeof(int));printf("输⼊%d个结点的权值\n",n);for(i = 0;i < n;i++)scanf("%d",&w[i]);HuffmanCoding(HT,HC,w,n);puts("\n各结点的哈夫曼编码:");for(i = 1;i <= n;i++)printf("%2d(%4d):%s\n",i,w[i-1],HC[i]);getchar(); }。

计算机数据结构知识点梳理 哈夫曼(Huffman)树和哈夫曼编码

计算机数据结构知识点梳理		哈夫曼(Huffman)树和哈夫曼编码
(2)在F中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一 棵新的二叉树,这棵新的二叉树根结点的权值为其左、右子树根结点权值之 和;
(3)在集合F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入 到集合F中;
(4)重复(2)(3)两步,当F中只剩下一棵二叉树时,这棵二叉树便是所要 建立的哈夫曼树。
(3)深度为h的哈夫曼树,其叶子结点的最大编码长度为h-1。
[题1]若度为m的哈夫曼树,其叶子结点个数为n,则非叶子结点 的个数为( )。
A.n-1 B.[n/m]-1 C.[(n-1)/(m-1)] D.[n/(m-1)]-1
分析:在构造度为m的哈夫曼树过程中,每次把m个子结点合并 为一个父结点(第一次合并可能少于m个子结点),每次合并 减少m-1个结点,从n个叶子结点减少到最后只剩一个父结点共 需[(n-1)/(m-1)]次合并,每次合并增加一个非叶子结点。
5、对哈夫曼树编码的总结
(1)哈夫曼编码是能使电文代码总长最短的编码方式。此结论由哈夫曼树是带 权路径长度最小的树的特征可得。
(2)哈夫曼编码是一种前缀编码,保证其在译码时不会产生歧义。因为,在哈 夫曼编码中,每个字符都是叶子结点,而叶子结点不可能从根结点到其他叶 子结点的路径上,所以一个字符的哈夫曼编码不可能是另一个字符的哈夫曼 编码的前缀。
知识点10:哈夫曼(HUFFMAN)树和哈夫曼编码
1、哈夫曼树(又称最优二叉树),是指对于一 组带有确定权值的叶结点,构造的具有最小带
权路径长度的二叉树。
2、哈夫曼树的构造方法的基本思想
(1)由给定的n个权值{W1,W2,…,Wn}构造n棵只有一个叶结点的二叉树, 从而得到一个二叉树的集合F={T1,T2,…,Tn};

6.6哈夫曼编码

6.6哈夫曼编码
(5)用计算机实现时,顺序和链式两种存储结构都要用到。
如何编程实现Huffman编码?
建议1:Huffman树中结点的结构可设计成5分量形式:
char weight parent lchild rchild
建议2: Huffman树的存储结构可采用顺序存储结构: 将整个Huffman树的结点存储在一个数组HT[1..n..m]中; 各叶子结点的编码存储在另一“复合”数组HC[1..n]中。
频度高的信息 用短码,反之 用长码,传输 效率肯定高!
令d=0;i=10,a=110,n=111,则: WPL2=1bit×7+2bit×5+3bit×(2+4)=35 明确:要实现Huffman编码,就要先构造Huffman树
例:假设字符A,B,C,D,E的出现概率为42, 28, 15, 10, 5。求电文的总长度最短的一种编码?
中序遍历的非递归算法或称迭代算法或称迭代算法见教材见教材p131p131设高度为h的二叉树上只有度为0的结点和度为2的结点则此类二叉树所包含的结点数至少为至多为已知某二叉树的后序遍历序列是dabec中序遍历序列是debac则它的前序遍历序列是已知某二叉树的前序遍历序列是abdgcefh中序遍历序列是dgbaechf则其后序遍历序列是某二叉树的前序序列为stuwv中序序列为uwtvs则其后序序列为任何一棵二叉树的叶结点在先序中序和后序遍历序列中的相对次序实现任意二叉树的后序遍历的非递归算法而不使用栈结构最佳方案是二叉树采用存储结构线索二叉树是一种结构一棵二叉树的结点的数据结构采用顺序存储见数组t则其二叉链表表示形式为
想一想:对它中序遍历之后是什么效果?
什么是带权树?
即路径带有权值。例如:
7
5
2
4

哈夫曼树哈夫曼编码(先序遍历方法)

哈夫曼树哈夫曼编码(先序遍历方法)

#include <stdio.h>#include <stdlib.h>typedef struct Tree{int weight;int left;int right;int parent;}*tree;void CreateHuffman(int n){int i;int m1,m2,x1,x2;tree Huffman[100];for(i=0;i< 2*n-1;i++){Huffman[i] = (tree) malloc(sizeof(struct Tree));}for(i=0;i<n;i++){scanf("%d",&Huffman[i]->weight);}for(i=0;i<2*n-1;i++){Huffman[i]->parent = -1;Huffman[i]->left = -1;Huffman[i]->right = -1;}int j;for(i=0;i<n-1;i++){m1= m2= 65536;x1 =x2 = 0;for(j=0;j<n+i;j++){if( Huffman[j]->weight < m1 && Huffman[j]->parent == -1){m1 = Huffman[j]->weight ;x1 = j;}}for(j=0;j<n+i;j++){if( Huffman[j]->weight < m2 && Huffman[j]->parent == -1 && x1 != j){m2 = Huffman[j]->weight ;x2 = j;}}Huffman[x1]->parent = n+i; Huffman[x2]->parent = n+i;Huffman[n+i]->weight =Huffman[x1]->weight + Huffman[x2]->weight ;Huffman[n+i]->left =x1; Huffman[n+i]->right =x2;}for(i=0;i<2*n-1;i++){printf("%d,", Huffman[i]->weight);}printf("\n");for(i=0;i<2*n-1;i++){printf("%d的左结点的下标为%d,右结点的下标为%d\n",Huffman[i]->weight,Huffman[i]->left,Huffman[i]->right);}char s[100]; int x; i--; x = i; int k; k=0;int rs[100];int ls[100]; i=1; tree q[100];int sum=0;for(j=0; j<100 ;j++){rs[j] =0;ls[j] =0; s[j]='\0';}while( i != 0){if(i==1 && k==0 ){q[i] = Huffman[x];s[i-1] = '*';k++;}while(q[i]->left !=-1 && ls[i] == 0){x =Huffman[x]->left;ls[i] = 1; i++; k++;q[i] = Huffman[x];s[i-1] ='0';ls[i] =0; rs[i] = 0;}if(( q[i]->left ==-1&& q[i]->right != -1 && rs[i] ==0 ) || (ls[i] ==1 && q[i]->right != -1&& rs[i] ==0 ) ){x =Huffman[x]->right;rs[i] =1; i++; k++;q[i] = Huffman[x];s[i-1] ='1';ls[i] =0; rs[i] = 0;}if( (q[i]->left ==-1 && q[i]->right ==-1 ) ){printf("%d:",q[i]->weight);for( j =1 ; j <i;j++)printf("%c",s[j]);printf("\n"); sum+= q[i]->weight *(i-1);}if( (q[i]->left ==-1 && rs[i] == 1 ) ||(q[i]->left ==-1 && q[i]->right == -1)||(q[i]->right ==-1 && ls[i] == 1 ) ||( rs[i] ==1&& ls[i] == 1 ) ){i--; k++;Huffman[x] =q[i];}}printf("带权长度为%d\n",sum);}void main(){int num; printf("输入叶子结点个数:");scanf("%d",&num);CreateHuffman( num);printf("\n");}。

数据结构哈夫曼树和哈夫曼编码PPT课件

数据结构哈夫曼树和哈夫曼编码PPT课件

C
AB
AC
BC
ABC
第27页/共55页
回朔策略—求幂集
000
000
100
000
010
100
110
000
001
010
011 100 101 110
111
第28页/共55页
回朔策略—求幂集
void powerSet(int num){ if (num<=len-1) { for (int i=0; i<2; i++){ if (i = = 0) mask[num]=1; else mask[num]=0; powerSet(num+1);} } else{ for (int j=0; j<len; j++){ if (mask[j]==1) printf("%c",set[j]);} printf("\n");}
}
第29页/共55页
回朔策略—求幂集
int len=3; int mask[]={0,0,0}; char set[]={'A','B','C'}; int main(int argc, char* argv[]) {
powerSet(0); return 0; }
第30页/共55页
章末复习
1. 熟练掌握二叉树的结构特性,了解相应的证 明方法。 2. 熟悉二叉树的各种存储结构的特点及适用范 围。 3. 遍历二叉树是二叉树各种操作的基础。实现 二叉树遍历的具体算法与所采用的存储结构有 关。掌握各种遍历策略的递归算法,灵活运用 遍历算法实现二叉树的其它操作。层次遍历是 按另一种搜索策略进行的遍历。

哈夫曼编码详解(C语言实现)

哈夫曼编码详解(C语言实现)

哈夫曼编码详解(C语言实现)哈夫曼编码是一种常见的前缀编码方式,被广泛应用于数据压缩和传输中。

它是由大卫·哈夫曼(David A. Huffman)于1952年提出的,用于通过将不同的字符映射到不同长度的二进制码来实现数据的高效编码和解码。

1.统计字符频率:遍历待编码的文本,记录每个字符出现的频率。

2.构建哈夫曼树:根据字符频率构建哈夫曼树,其中出现频率越高的字符位于树的较低层,频率越低的字符位于树的较高层。

3.生成编码表:从哈夫曼树的根节点开始,遍历哈夫曼树的每个节点,为每个字符生成对应的编码。

在遍历过程中,从根节点到叶子节点的路径上的“0”表示向左,路径上的“1”表示向右。

4.进行编码:根据生成的编码表,将待编码的文本中的每个字符替换为对应的编码。

5.进行解码:根据生成的编码表和编码结果,将编码替换为原始字符。

下面是一个用C语言实现的简单哈夫曼编码示例:```c#include <stdio.h>#include <stdlib.h>#include <string.h>//定义哈夫曼树的节点结构体typedef struct HuffmanNodechar data; // 字符数据int freq; // 字符出现的频率struct HuffmanNode *left; // 左子节点struct HuffmanNode *right; // 右子节点} HuffmanNode;//定义编码表typedef structchar data; // 字符数据char *code; // 字符对应的编码} HuffmanCode;//统计字符频率int *countFrequency(char *text)int *frequency = (int *)calloc(256, sizeof(int)); int len = strlen(text);for (int i = 0; i < len; i++)frequency[(int)text[i]]++;}return frequency;//创建哈夫曼树HuffmanNode *createHuffmanTree(int *frequency)//初始化叶子节点HuffmanNode **leaves = (HuffmanNode **)malloc(256 * sizeof(HuffmanNode *));for (int i = 0; i < 256; i++)if (frequency[i] > 0)HuffmanNode *leaf = (HuffmanNode*)malloc(sizeof(HuffmanNode));leaf->data = (char)i;leaf->freq = frequency[i];leaf->left = NULL;leaf->right = NULL;leaves[i] = leaf;} elseleaves[i] = NULL;}}//构建哈夫曼树while (1)int min1 = -1, min2 = -1;for (int i = 0; i < 256; i++)if (leaves[i] != NULL)if (min1 == -1 , leaves[i]->freq < leaves[min1]->freq) min2 = min1;min1 = i;} else if (min2 == -1 , leaves[i]->freq < leaves[min2]->freq)min2 = i;}}}if (min2 == -1)break;}HuffmanNode *parent = (HuffmanNode*)malloc(sizeof(HuffmanNode));parent->data = 0;parent->freq = leaves[min1]->freq + leaves[min2]->freq;parent->left = leaves[min1];parent->right = leaves[min2];leaves[min1] = parent;leaves[min2] = NULL;}HuffmanNode *root = leaves[min1];free(leaves);return root;//生成编码表void generateHuffmanCode(HuffmanNode *root, HuffmanCode *huffmanCode, char *code, int depth)if (root->left == NULL && root->right == NULL)code[depth] = '\0';huffmanCode[root->data].data = root->data;huffmanCode[root->data].code = strdup(code);return;}if (root->left != NULL)code[depth] = '0';generateHuffmanCode(root->left, huffmanCode, code, depth + 1);}if (root->right != NULL)code[depth] = '1';generateHuffmanCode(root->right, huffmanCode, code, depth + 1);}//进行编码char *encodeText(char *text, HuffmanCode *huffmanCode)int len = strlen(text);int codeLen = 0;char *code = (char *)malloc(len * 8 * sizeof(char));for (int i = 0; i < len; i++)strcat(code + codeLen, huffmanCode[(int)text[i]].code);codeLen += strlen(huffmanCode[(int)text[i]].code);}return code;//进行解码char* decodeText(char* code, HuffmanNode* root) int len = strlen(code);char* text = (char*)malloc(len * sizeof(char)); int textLen = 0;HuffmanNode* node = root;for (int i = 0; i < len; i++)if (code[i] == '0')node = node->left;} elsenode = node->right;}if (node->left == NULL && node->right == NULL) text[textLen] = node->data;textLen++;node = root;}}text[textLen] = '\0';return text;int maichar *text = "Hello, World!";int *frequency = countFrequency(text);HuffmanNode *root = createHuffmanTree(frequency);HuffmanCode *huffmanCode = (HuffmanCode *)malloc(256 * sizeof(HuffmanCode));char code[256];generateHuffmanCode(root, huffmanCode, code, 0);char *encodedText = encodeText(text, huffmanCode);char *decodedText = decodeText(encodedText, root);printf("Original Text: %s\n", text);printf("Encoded Text: %s\n", encodedText);printf("Decoded Text: %s\n", decodedText);//释放内存free(frequency);free(root);for (int i = 0; i < 256; i++)if (huffmanCode[i].code != NULL)free(huffmanCode[i].code);}}free(huffmanCode);free(encodedText);free(decodedText);return 0;```上述的示例代码实现了一个简单的哈夫曼编码和解码过程。

数据结构——哈夫曼(Huffman)树+哈夫曼编码

数据结构——哈夫曼(Huffman)树+哈夫曼编码

数据结构——哈夫曼(Huffman)树+哈夫曼编码前天acm实验课,⽼师教了⼏种排序,抓的⼀套题上有⼀个哈夫曼树的题,正好之前离散数学也讲过哈夫曼树,这⾥我就结合课本,整理⼀篇关于哈夫曼树的博客。

哈夫曼树的介绍Huffman Tree,中⽂名是哈夫曼树或霍夫曼树,它是最优⼆叉树。

定义:给定n个权值作为n个叶⼦结点,构造⼀棵⼆叉树,若树的带权路径长度达到最⼩,则这棵树被称为哈夫曼树。

这个定义⾥⾯涉及到了⼏个陌⽣的概念,下⾯就是⼀颗哈夫曼树,我们来看图解答。

(01) 路径和路径长度定义:在⼀棵树中,从⼀个结点往下可以达到的孩⼦或孙⼦结点之间的通路,称为路径。

通路中分⽀的数⽬称为路径长度。

若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。

例⼦:100和80的路径长度是1,50和30的路径长度是2,20和10的路径长度是3。

(02) 结点的权及带权路径长度定义:若将树中结点赋给⼀个有着某种含义的数值,则这个数值称为该结点的权。

结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。

例⼦:节点20的路径长度是3,它的带权路径长度= 路径长度 * 权 = 3 * 20 = 60。

(03) 树的带权路径长度定义:树的带权路径长度规定为所有叶⼦结点的带权路径长度之和,记为WPL。

例⼦:⽰例中,树的WPL= 1*100 + 2*50 +3*20 + 3*10 = 100 + 100 + 60 + 30 = 290。

⽐较下⾯两棵树上⾯的两棵树都是以{10, 20, 50, 100}为叶⼦节点的树。

左边的树WPL=2*10 + 2*20 + 2*50 + 2*100 = 360 右边的树WPL=350左边的树WPL > 右边的树的WPL。

你也可以计算除上⾯两种⽰例之外的情况,但实际上右边的树就是{10,20,50,100}对应的哈夫曼树。

⾄此,应该堆哈夫曼树的概念有了⼀定的了解了,下⾯看看如何去构造⼀棵哈夫曼树。

哈夫曼编码构造哈夫曼树

哈夫曼编码构造哈夫曼树

哈夫曼编码构造哈夫曼树哈夫曼编码是一种用于数据压缩的编码方法,它通过构建哈夫曼树来实现无损压缩。

在本文中,我们将详细介绍哈夫曼编码以及如何使用它构造哈夫曼树。

首先,让我们来了解一下哈夫曼编码的基本原理。

哈夫曼编码是一种变长编码,它通过为出现频率较高的字符分配较短的编码,而为出现频率较低的字符分配较长的编码。

这样做的目的是使得编码后的数据长度更短,从而实现数据的压缩。

接下来,我们将介绍如何构造哈夫曼树。

构造哈夫曼树的过程可以分为以下几个步骤:步骤一:统计字符频率首先,我们需要统计输入数据中各个字符的频率。

这可以通过遍历输入数据的方式来实现。

对于每个字符,我们可以使用一个数组或者字典来记录它出现的频率。

步骤二:构建最小堆在构造哈夫曼树之前,我们需要先构建一个最小堆。

最小堆是一种特殊的二叉树,它的根节点的值小于等于其子节点的值。

在最小堆中,我们将频率较低的字符放在根节点,频率较高的字符放在子节点。

为了构建最小堆,我们可以使用一个优先队列。

优先队列是一种特殊的队列,它的元素按照一定的优先级排列。

在我们的例子中,优先队列的优先级是根据字符频率来确定的。

当我们向优先队列中插入元素时,它们会按照优先级自动进行排序。

步骤三:构建哈夫曼树一旦我们构建了最小堆,我们就可以开始构建哈夫曼树了。

构建哈夫曼树的过程可以通过执行以下步骤完成:1. 从最小堆中取出频率最低的两个字符,并将它们合并为一个新的节点。

新节点的频率是两个子节点频率之和。

2. 将新节点插入最小堆中,并重新调整堆的结构,使得最小频率的字符位于根节点。

3. 重复步骤 1 和步骤 2,直到最小堆中只剩下一个节点。

这个节点就是哈夫曼树的根节点。

步骤四:构建编码表当我们构建了哈夫曼树之后,我们可以利用这棵树来构建编码表。

编码表是一个字典,它将每个字符映射到对应的哈夫曼编码。

我们可以通过遍历哈夫曼树的方式来构建编码表,具体方法如下:1. 从根节点开始,遍历左子树路径时,将路径上的每个节点对应的字符编码添加一个 '0'。

哈夫曼树算法

哈夫曼树算法

哈夫曼树算法
哈夫曼树算法是一种常用的树形数据结构,也被称为最优二叉树算法。

它是由美国计算机科学家David A. Huffman于1952年发明的,用于数据压缩和编码的问题中。

哈夫曼树算法的基本思想是,将出现频率较高的字符编码为较短的二进制序列,而将出现频率较低的字符编码为较长的二进制序列,以达到压缩数据的目的。

这种编码方式被称为哈夫曼编码。

哈夫曼树算法的构建过程是从数据源中选出频率最小的两个数据,将它们合并成一个新的节点,其权重为这两个数据的权重之和。

然后再将这个新节点加入到数据源中,重复这个过程,直到数据源中只剩下一个节点,这个节点就是哈夫曼树的根节点。

哈夫曼树的权重值是所有叶子节点的权重乘以它们的深度之和,也是数据压缩的效率指标。

哈夫曼树算法可以用来解决许多经典的问题,如最优合并策略、最优缩短编码长度等。

总之,哈夫曼树算法是一种非常重要的算法,对于数据压缩和编码问题有着广泛的应用。

它的实现方法也比较简单,但是需要对数据源进行一定的分析和预处理,以得到最优的数据压缩效果。

- 1 -。

哈夫曼编码的python实现

哈夫曼编码的python实现

哈夫曼编码的python实现# 哈夫曼编码的Python实现详解哈夫曼编码(Huffman Coding)是一种根据字符出现频率来构造前缀树,进而得到最优字典编码的算法。

它在数据压缩领域具有广泛应用,尤其对于文本数据,通过将频繁出现的字符赋予较短的编码,从而达到减少存储空间的效果。

本文将详细阐述如何使用Python语言实现哈夫曼编码。

# 一、理解哈夫曼树与哈夫曼编码原理哈夫曼树,又称最优二叉树或最小带权路径长度树,是一种带权重的二叉树,其特性是权值越小的叶子节点离根节点越近。

构建哈夫曼树的过程就是对原始字符及其频率进行不断合并,最终形成每个叶子节点代表一个字符,其路径长度即为该字符的编码长度。

哈夫曼编码则是基于哈夫曼树的一种前缀编码方式,即任何字符的编码都不是其他字符编码的前缀,这保证了编码的唯一可解性。

# 二、哈夫曼树的Python实现步骤1. 定义节点类:首先,我们需要定义一个用于表示哈夫曼树节点的类,包含字符、频率以及左右子节点等属性。

pythonclass TreeNode:def __init__(self, char=None, freq=0, left=None, right=None): self.char = charself.freq = freqself.left = leftself.right = right2. 构建频率列表:统计输入字符串中各字符的出现频率,将其放入一个列表,每个元素是一个包含字符和频率的元组。

pythondef build_freq_dict(text):freq_dict = {}for char in text:if char in freq_dict:freq_dict[char] += 1else:freq_dict[char] = 1return sorted(freq_dict.items(), key=lambda x: x[1],reverse=True)3. 构建哈夫曼树:创建一个空堆,并将所有字符及其频率作为单独的节点加入堆中,然后进行循环,每次取出两个频率最小的节点合并生成新的节点(新节点的频率为其两子节点频率之和),并将新节点放回堆中,直到堆中只剩下一个节点,这个节点就是哈夫曼树的根节点。

数据结构与算法:哈夫曼树

数据结构与算法:哈夫曼树

数据结构与算法:哈夫曼树哈夫曼树给定N个权值作为N个叶⼦结点,构造⼀棵⼆叉树,若该树的带权路径长度达到最⼩,称这样的⼆叉树为最优⼆叉树,也称为哈夫曼树(Huffman Tree)。

哈夫曼树是带权路径长度最短的树,权值较⼤的结点离根较近。

重要概念路径:从⼀个节点到它往下可以达到的节点所经shu过的所有节点,称为两个节点之间的路径路径长度:即两个节点的层级差,如A节点在第⼀层,B节点在第四层,那它们之间的路径长度为4-1=3权重值:为树中的每个节点设置⼀个有某种含义的数值,称为权重值(Weight),权重值在不同算法中可以起到不同的作⽤节点的带权路径长度:从根节点到该节点的路径长度与该节点权重值的乘积树的带权路径长度:所有叶⼦节点的带权路径长度之和,也简称为WPL哈夫曼树判断判断⼀棵树是不是哈夫曼树只要判断该树的结构是否构成最短带权路径。

在下图中3棵同样叶⼦节点的树中带权路径最短的是右侧的树,所以右侧的树就是哈夫曼树。

代码实现案例:将数组{13,7,8,3,29,6,1}转换成⼀棵哈夫曼树思路分析:从哈夫曼树的概念中可以看出,要组成哈夫曼树,权值越⼤的节点必须越靠近根节点,所以在组成哈夫曼树时,应该由最⼩权值的节点开始。

步骤:(1) 将数组转换成节点,并将这些节点由⼩到⼤进⾏排序存放在集合中(2) 从节点集合中取出权值最⼩的两个节点,以这两个节点为⼦节点创建⼀棵⼆叉树,它们的⽗节点权值就是它们的权值之和(3) 从节点集合中删除取出的两个节点,并将它们组成的⽗节点添加进节点集合中,跳到步骤(2)直到节点集合中只剩⼀个节点public class HuffmanTreeDemo {public static void main(String[] args) {int array[] = {13,7,8,3,29,6,1};HuffmanTree huffmanTree = new HuffmanTree();Node root = huffmanTree.create(array);huffmanTree.preOrder(root);}}//哈夫曼树class HuffmanTree{public void preOrder(Node root){if (root == null){System.out.println("哈夫曼树为空,⽆法遍历");return;}root.preOrder();}/*** 创建哈夫曼树* @param array 各节点的权值⼤⼩* @return*/public Node create(int array[]){//先将传⼊的各权值转成节点并添加到集合中List<Node> nodes = new ArrayList<>();for (int value : array){nodes.add(new Node(value));}/*当集合中的数组只有⼀个节点时,即集合内所有节点已经组合完成,剩下的唯⼀⼀个节点即是哈夫曼树的根节点*/while (nodes.size() > 1){//将节点集合从⼩到⼤进⾏排序//注意:如果在节点类没有实现Comparable接⼝,则⽆法使⽤Collections.sort(nodes);//在集合内取出权值最⼩的两个节点Node leftNode = nodes.get(0);Node rightNode = nodes.get(1);//以这两个节点创建⼀个新的⼆叉树,它们的⽗节点的权值即是它们的权值之和Node parent = new Node(leftNode.weight + rightNode.weight);parent.left = leftNode;parent.right = rightNode;//再从集合中删除已经组合成⼆叉树的俩个节点,并把它们俩个的⽗节点加⼊到集合中nodes.remove(leftNode);nodes.remove(rightNode);nodes.add(parent);}//返回哈夫曼树的根节点return nodes.get(0);}}//因为要在节点的集合内,以节点的权值value,从⼩到⼤进⾏排序,所以要实现Comparable<>接⼝class Node implements Comparable<Node>{int weight;//节点的权值Node left;Node right;public Node(int weight) {this.weight = weight;}public void preOrder(){System.out.println(this);if (this.left != null){this.left.preOrder();}if (this.right != null){this.right.preOrder();}}@Overridepublic String toString() {return "Node{" +"weight=" + weight +'}';}@Overridepublic int compareTo(Node o) {return this.weight - o.weight;}}哈夫曼编码定长编码固定长度编码⼀种⼆进制信息的信道编码。

哈夫曼树与哈夫曼树编码实验原理

哈夫曼树与哈夫曼树编码实验原理

哈夫曼树与哈夫曼树编码实验原理哈夫曼树(Huffman Tree)是一种用于数据压缩的树形数据结构。

它的主要原理是通过构建一个最优的二叉树来实现编码和解码的过程。

以下是哈夫曼树和哈夫曼编码的实验原理:1. 构建哈夫曼树:- 给定一组需要进行编码的字符及其出现频率。

通常,这个频率信息可以通过统计字符在原始数据中的出现次数来得到。

- 创建一个叶节点集合,每个叶节点包含一个字符及其对应的频率。

- 从叶节点集合中选择两个频率最低的节点作为左右子节点,创建一个新的父节点。

父节点的频率等于左右子节点频率的和。

- 将新创建的父节点插入到叶节点集合中,并将原来的两个子节点从集合中删除。

- 重复上述步骤,直到叶节点集合中只剩下一个节点,即根节点,这个节点就是哈夫曼树的根节点。

2. 构建哈夫曼编码:- 从哈夫曼树的根节点开始,沿着左子树走一步就表示编码的0,沿着右子树走一步表示编码的1。

- 遍历哈夫曼树的每个叶节点,记录从根节点到叶节点的路径,得到每个字符对应的编码。

由于哈夫曼树的构建过程中,频率较高的字符在树中路径较短,频率较低的字符在树中路径较长,因此哈夫曼编码是一种前缀编码,即没有任何一个字符的编码是其他字符编码的前缀。

3. 进行数据压缩:- 将原始数据中的每个字符替换为其对应的哈夫曼编码。

- 将替换后的编码串连接起来,形成压缩后的数据。

4. 进行数据解压缩:- 使用相同的哈夫曼树,从根节点开始,按照压缩数据中的每个0或1进行遍历。

- 当遇到叶节点时,就找到了一个字符,将其输出,并从根节点重新开始遍历。

- 继续按照压缩数据的编码进行遍历,直到所有的编码都解压为字符。

通过构建最优的哈夫曼树和对应的编码表,可以实现高效的数据压缩和解压缩。

频率较高的字符使用较短的编码,从而达到减小数据大小的目的。

而频率较低的字符使用较长的编码,由于其出现频率较低,整体数据大小的增加也相对较小。

哈夫曼编码节点数

哈夫曼编码节点数

哈夫曼编码节点数【原创版】目录1.哈夫曼编码概述2.哈夫曼编码节点数的计算方法3.哈夫曼编码节点数的应用4.总结正文1.哈夫曼编码概述哈夫曼编码是一种无损数据压缩编码方法,它可以将原始数据转换为对应的编码,然后通过解码过程还原原始数据。

哈夫曼编码的核心思想是按照数据的出现频率构建一颗哈夫曼树,然后将原始数据转换为对应的哈夫曼树节点路径。

在这个过程中,哈夫曼编码节点数是一个重要的概念,它直接影响到压缩效果和解压效率。

2.哈夫曼编码节点数的计算方法哈夫曼编码节点数的计算方法主要依赖于哈夫曼树的结构。

哈夫曼树是一棵满足最优二叉树性质的树,它的构造过程如下:(1)将原始数据中的每个字符作为叶子节点,将其出现的频率作为权值。

(2)在所有节点中选择权值最小的两个节点,将它们作为一棵新二叉树的左右子节点,且它们的权值之和作为新节点的权值。

(3)将这两个节点从原节点集合中移除,将新节点加入集合。

(4)重复步骤(2)和(3),直到只剩下一个节点,这个节点就是哈夫曼树的根节点。

哈夫曼编码节点数等于哈夫曼树中节点的个数。

根据哈夫曼树的构造过程,可以递归地计算出哈夫曼编码节点数。

3.哈夫曼编码节点数的应用哈夫曼编码节点数在实际应用中有很多作用,例如:(1)评估压缩效果:哈夫曼编码节点数越小,表示原始数据中的信息冗余度越高,压缩效果越好。

(2)选择最优编码:在多个哈夫曼树构造方法中,选择节点数最小的哈夫曼树作为最优编码。

(3)调整编码参数:当哈夫曼编码节点数较大时,可以通过调整编码参数(如码字长度)来提高压缩效果。

4.总结哈夫曼编码节点数是哈夫曼编码中一个重要的概念,它反映了原始数据的信息冗余度和压缩效果。

计算哈夫曼编码节点数的方法依赖于哈夫曼树的结构,可以通过递归方法实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
for(i=0;i<2*n-1;i++)
{
printf("%d,", Huffman[i]->weight);
}
printf("\n");
for(i=0;i<2*n-1;i++)
{
printf("%d的左结点的下标为%d,右结点的下标为%d\n",Huffman[i]->weight,Huffman[i]->left,Huffman[i]->right);
{
if(i==1 && k==0 )
{
q[i] = Huffman[x];
s[i-1] = '*';
k++;
}
while(q[i]->left !=-1 && ls[i] == 0)
{
x =Huffman[x]->left;
ls[i] = 1; i++; k++;
q[i] = Huffman[x];
{
m1 = Huffman[j]->weight ;
x1 = j;
}
}
for(j=0;j<n+i;j++)
{
if( Huffman[j]->weight < m2 && Huffman[j]->parent == -1 && x1 != j)
{
m2 = Huffman[j]->weight ;
x2 = j;
tree Huffman[100];
for(i=0;i< 2*n-1;i++)
{
Huffman[i] = (tree) malloc(sizeof(struct Tree));
}
for(i=0;i<n;i++)
{
scanf("%d",&Huffman[i]->weight);
}
for(i=0;i<2*n-1;i++)
{
Huffman[i]->parent = -1;
Huffman[i]->left = -1;
Huffman[i]->right = -1;}int j;
for(i=0;i<n-1;i++)
{
m1= m2= 65536;
x1 =x2 = 0;
for(j=0;j<n+i;j++)
{
if( Huffman[j]->weight < m1 && Huffman[j]->parent == -1)
}
char s[100]; int x; i--; x = i; int k; k=0;
int rs[100];int ls[100]; i=1; tree q[100];
int sum=0;
for(j=0; j<100 ;j++)
{
rs[j] =0;ls[j] =0; s[j]='\0';
}
while( i != 0)
}
}
Huffman[x1]->parent = n+i; Huffman[x2]->parent = n+i;
Huffman[n+i]->weight =Huffman[x1]->weight + Huffman[x2]->weight ;
Huffman[n+i]->left =x1; Huffman[n+i]->right =x2;
#include <stdio.h>
#include <stdlib.h>
typedef struct Tree
{
int weight;
int left;
int right;
int parent;
}*tree;
void CreateHuffman(int n)
{
int i;
int m1,m2,x1,x2;
{
i--; k++;
Huffman[x] =q[i];
}
}
printf("带权长度为%d\n",sum);
}
void main()
{
int num; printf("输入叶子结点个数:");scanf("%d",&num);
CreateHuffman( num);
printf("\n");
}
printf("%c",s[j]);
printf("\n"); sum+= q[i]->weight *(i-1);
}
if( (q[i]->left ==-1 && rs[i] == 1 ) ||(q[i]->left ==-1 && q[i]->right == -1)
||(q[i]->right ==-1 && ls[i] == 1 ) ||( rs[i] ==1&& ls[i] == 1 ) )
s[i-1] ='0';
ls[i] =0; rs[i] = 0;
}
if(( q[i]->left ==-1&& q[i]->right != -1 && rs[i] ==0 ) || (ls[i] ==1 && q[i]->right != -1&& rs[i] ==0 ) )
{
x =Huffman[x]->right;
rs[i] =1;i++; k++;
q[i] = Huffman[x];
s[i-1] ='1';
ls[i] =0; rs[i] = 0;
}
if( (q[i]->left ==-1 && q[i]->right ==-1 ) )
{
printf("%d:",q[i]->weight);
for( j =1 ; j <i;j++)
相关文档
最新文档