创建哈夫曼树
- 格式:doc
- 大小:36.00 KB
- 文档页数:6
c语言实现哈夫曼算法以下是C语言实现哈夫曼算法的示例代码:```cinclude <>include <>include <>// 定义哈夫曼树节点结构体typedef struct HuffmanNode {char data; // 节点存储的数据int freq; // 节点出现的频率struct HuffmanNode left, right; // 左右子树指针} HuffmanNode;// 定义创建哈夫曼树函数HuffmanNode createNode(char data, int freq) { HuffmanNode node =(HuffmanNode)malloc(sizeof(HuffmanNode));node->data = data;node->freq = freq;node->left = node->right = NULL;return node;}// 定义比较函数,用于按照频率从小到大排序int compare(const void a, const void b) {return ((HuffmanNode)b)->freq - ((HuffmanNode)a)->freq; }// 定义构建哈夫曼树函数HuffmanNode buildHuffmanTree(char data[], int freq[], int size) { if (size == 1) {return createNode(data[0], freq[0]);} else {HuffmanNode nodes[size]; // 存储所有节点指针的数组for (int i = 0; i < size; i++) {nodes[i] = createNode(data[i], freq[i]);}qsort(nodes, size, sizeof(HuffmanNode), compare); // 按频率从小到大排序return mergeNodes(nodes, size); // 合并两个最小的节点,直到只剩下一个节点}}// 定义合并两个最小节点函数HuffmanNode mergeNodes(HuffmanNode nodes[], int size) {if (size == 0) return NULL; // 空节点返回NULL指针if (size == 1) return nodes[0]; // 只剩下一个节点直接返回该节点指针 HuffmanNode root = createNode('$', nodes[0]->freq + nodes[1]->freq); // 创建根节点,频率为左右子树频率之和root->left = mergeNodes(nodes+1, size-1); // 递归合并剩余节点,左子树指向左子树数组中除第一个节点外的所有节点指针,右子树指向右子树数组中除最后一个节点外的所有节点指针return root; // 返回根节点指针}```。
北邮数据结构实验报告北京邮电大学信息与通信工程学院2009级数据结构实验报告实验名称:实验三哈夫曼编/解码器的实现学生姓名:陈聪捷日期:2010年11月28日1.实验要求一、实验目的:了解哈夫曼树的思想和相关概念;二、实验内容:利用二叉树结构实现哈夫曼编/解码器1.初始化:能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立哈夫曼树。
2.建立编码表:利用已经建好的哈夫曼树进行编码,并将每个字符的编码输出。
3.编码:根据编码表对输入的字符串进行编码,并将编码后的字符串输出。
4.译码:利用已经建好的哈夫曼树对编码后的字符串进行译码,并输出译码结果。
5.打印:以直观的方式打印哈夫曼树。
6.计算输入的字符串编码前和编码后的长度,并进行分析,讨论哈夫曼编码的压缩效果。
7.用户界面可以设计成“菜单”方式,能进行交互,根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符一律不用编码。
2.程序分析2.1存储结构二叉树templateclassBiTree{public:BiTree();//构造函数,其前序序列由键盘输入~BiTree(void);//析构函数BiNode*Getroot();//获得指向根结点的指针protected:BiNode*root;//指向根结点的头指针};//声明类BiTree及定义结构BiNodeData:二叉树是由一个根结点和两棵互不相交的左右子树构成data:HCode*HCodeTable;//编码表inttSize;//编码表中的总字符数二叉树的节点结构templatestructBiNode//二叉树的结点结构{Tdata;//记录数据Tlchild;//左孩子Trchild;//右孩子Tparent;//双亲};编码表的节点结构structHCode{chardata;//编码表中的字符charcode[100];//该字符对应的编码};待编码字符串由键盘输入,输入时用链表存储,链表节点为structNode{charcharacter;//输入的字符unsignedintcount;//该字符的权值boolused;//建立树的时候该字符是否使用过Node*next;//保存下一个节点的地址};示意图:2.2关键算法分析1.初始化函数(voidHuffmanTree::Init(stringInput))算法伪代码:1.初始化链表的头结点2.获得输入字符串的第一个字符,并将其插入到链表尾部,n=1(n 记录的是链表中字符的个数)3.从字符串第2个字符开始,逐个取出字符串中的字符3.1将当前取出的字符与链表中已经存在的字符逐个比较,如果当前取出的字符与链表中已经存在的某个字符相同,则链表中该字符的权值加1。
哈夫曼树的建立及操作哈夫曼树是一种用于数据压缩的树形数据结构,可以有效地压缩数据并减小存储空间。
本文将介绍哈夫曼树的建立方法和相关操作。
一、哈夫曼树的建立方法:1.首先,我们需要统计给定数据中每个字符出现的频率。
频率越高的字符将被赋予较短的编码,从而实现数据的压缩。
可以使用一个字典或哈希表来记录字符及其频率。
2.创建一个包含所有字符频率的节点列表。
每个节点包含一个字符及其对应的频率。
3.排序节点列表,按照频率从小到大的顺序进行排序。
4.创建一个空的二叉树,并将频率最低的两个节点作为子节点,合并为一个新的节点。
新节点的频率为两个子节点的频率之和。
将这个新节点插入到节点列表中。
5.从节点列表中移除原先的两个子节点,插入新节点。
保持列表的有序性。
6.重复步骤4和5,直到节点列表中只剩下一个节点。
7.最后剩下的节点即为哈夫曼树的根节点。
二、哈夫曼树的操作:1.获取哈夫曼编码:根据哈夫曼树的结构,可以通过遍历树的路径来获取每个字符的编码。
左子树表示0,右子树表示1、从根节点出发,依次遍历所有叶子节点,记录下每个字符对应的路径即可得到编码。
2.数据压缩:将原始数据中的每个字符替换为对应的哈夫曼编码,从而实现数据压缩。
根据频率,越常见的字符编码越短,可以大幅减小数据存储的空间。
3.数据解压:使用相同的哈夫曼树,将压缩后的二进制编码解码为原始字符,从而还原数据。
4. 哈夫曼树的存储和传输:为了实现数据的压缩和解压缩,哈夫曼树需要存储和传输。
可以使用二进制格式存储树的结构和频率信息,并在解压缩时重新构建树。
还可以考虑使用霍夫曼编码的变种,如Adaptive Huffman Coding(自适应哈夫曼编码),使得树结构可以随着数据的变化进行更高效的编码和解码。
总结:哈夫曼树是一种用于数据压缩的树形数据结构,可以通过统计字符频率来生成树,并生成对应的编码。
通过编码,可以实现原始数据的高效压缩和解压缩。
在实际应用中,哈夫曼树被广泛应用于数据压缩,如文件压缩、图像压缩等。
数据结构实验报告实验名称:实验3——哈夫曼编码学生姓名:班级:班内序号:学号:日期:2013年11月24日1.实验要求利用二叉树结构实现赫夫曼编/解码器。
基本要求:1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立赫夫曼树2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。
3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。
4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。
5、打印(Print):以直观的方式打印赫夫曼树(选作)6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。
2. 程序分析2.1存储结构:struct HNode{char c;//存字符内容int weight;int lchild, rchild, parent;};struct HCode{char data;char code[100];}; //字符及其编码结构class Huffman{private:HNode* huffTree; //Huffman树HCode* HCodeTable; //Huffman编码表public:Huffman(void);void CreateHTree(int a[], int n); //创建huffman树void CreateCodeTable(char b[], int n); //创建编码表void Encode(char *s, string *d); //编码void Decode(char *s, char *d); //解码void differ(char *,int n);char str2[100];//数组中不同的字符组成的串int dif;//str2[]的大小~Huffman(void);};结点结构为如下所示:三叉树的节点结构:struct HNode//哈夫曼树结点的结构体{ int weight;//结点权值int parent;//双亲指针int lchild;//左孩子指针int rchild;//右孩子指针char data;//字符};示意图为:int weight int parent int lchild int rchild Char c 编码表节点结构:struct HCode//编码表结构体{char data;//字符char code[100];//编码内容};示意图为:基本结构体记录字符和出现次数:struct node{int num;char data;};示意图为:2.关键算法分析(1).初始化:伪代码:1.输入需要编译的文本内容2.将输入的内容保存到数组str1中3.统计出现的字符数目,并且保存到变量count中4.统计出现的不同的字符,存到str2中,将str2的大小存到dif中时间复杂度O(n!)(2).创建哈夫曼树算法伪代码:1.创建一个长度为2*n-1的三叉链表2.将存储字符及其权值的链表中的字符逐个写入三叉链表的前n个结点的data域,并将对应结点的孩子域和双亲域赋为空3.从三叉链表的第n个结点开始,3.1从存储字符及其权值的链表中取出两个权值最小的结点x,y,记录其下标x,y。
最优⼆叉树(哈夫曼树)的构建及编码参考:数据结构教程(第五版)李春葆主编⼀,概述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语言1.引言1.1 概述哈夫曼树及哈夫曼编码是数据压缩和编码中常用的重要算法。
哈夫曼树由大卫·哈夫曼于1952年提出,用于根据字符出现的频率构建一种最优的前缀编码方式。
而哈夫曼编码则是根据哈夫曼树构建的编码表将字符进行编码的过程。
在现代通信和计算机领域,数据传输和存储中往往需要大量的空间。
为了有效利用有限的资源,减少数据的存储和传输成本,数据压缩成为一个重要的技术。
而哈夫曼树及哈夫曼编码正是数据压缩中常用的技术之一。
哈夫曼树的概念及原理是基于字符的频率和概率进行构建的。
在哈夫曼树中,字符出现频率越高的节点越接近根节点,出现频率越低的节点离根节点越远。
这种构建方式保证了哈夫曼树的最优性,即最小化编码的总长度。
哈夫曼编码的算法实现是根据哈夫曼树构建的编码表进行的。
编码表中,每个字符都与一段二进制编码相对应。
在进行数据压缩和解压缩时,通过查表的方式将字符转化为相应的二进制编码,或将二进制编码解析为原始字符。
本文旨在介绍哈夫曼树及哈夫曼编码的概念和原理,并通过C语言实现算法。
通过深入理解哈夫曼树及哈夫曼编码的实现过程,可以更好地理解数据压缩和编码的原理,为后续的研究和应用提供基础。
接下来,我们将首先介绍哈夫曼树的概念和原理,然后详细讲解哈夫曼编码的算法实现。
最后,我们将总结哈夫曼树及哈夫曼编码的重要性,并提出对哈夫曼树和哈夫曼编码进一步研究的方向。
让我们一起深入探索哈夫曼树及哈夫曼编码的奥秘吧!1.2 文章结构文章结构部分的内容可以包括以下内容:文章结构部分主要介绍了本文的组织结构和各个章节的内容概述,以帮助读者更好地理解全文的逻辑结构和内容安排。
首先,本文包括引言、正文和结论三个部分。
引言部分主要对哈夫曼树及哈夫曼编码的算法实现进行了概述,包括相关的概念、原理和目的。
正文部分则深入介绍了哈夫曼树的概念和原理,以及哈夫曼编码的算法实现。
最后,结论部分对本文的主要内容进行了总结,并提出了对哈夫曼树和哈夫曼编码的进一步研究方向。
一、实训目的本次实训旨在通过实际操作,让学生掌握哈夫曼树的基本概念、构建方法以及编码解码过程,加深对数据结构中树型结构在实际应用中的理解。
通过本次实训,学生能够:1. 理解哈夫曼树的基本概念和构建原理;2. 掌握哈夫曼树的编码和解码方法;3. 熟悉Java编程语言在哈夫曼树编码中的应用;4. 提高数据压缩和传输效率的认识。
二、实训内容1. 哈夫曼树的构建(1)创建叶子节点:根据给定的字符及其权值,创建叶子节点,并设置节点信息。
(2)构建哈夫曼树:通过合并权值最小的两个节点,不断构建新的节点,直到所有节点合并为一棵树。
2. 哈夫曼编码(1)遍历哈夫曼树:从根节点开始,按照左子树为0、右子树为1的规则,记录每个叶子节点的路径。
(2)生成编码:将遍历过程中记录的路径转换为二进制编码,即为哈夫曼编码。
3. 哈夫曼解码(1)读取编码:将编码字符串按照二进制位读取。
(2)遍历哈夫曼树:从根节点开始,根据读取的二进制位,在哈夫曼树中寻找对应的节点。
(3)输出解码结果:当找到叶子节点时,输出对应的字符,并继续读取编码字符串。
三、实训过程1. 准备工作(1)创建一个Java项目,命名为“HuffmanCoding”。
(2)在项目中创建以下三个类:- HuffmanNode:用于存储哈夫曼树的节点信息;- HuffmanTree:用于构建哈夫曼树、生成编码和解码;- Main:用于实现主函数,接收用户输入并调用HuffmanTree类进行编码和解码。
2. 编写代码(1)HuffmanNode类:```javapublic class HuffmanNode {private char data;private int weight;private HuffmanNode left;private HuffmanNode right;public HuffmanNode(char data, int weight) {this.data = data;this.weight = weight;}}```(2)HuffmanTree类:```javaimport java.util.PriorityQueue;public class HuffmanTree {private HuffmanNode root;public HuffmanNode buildHuffmanTree(char[] data, int[] weight) {// 创建优先队列,用于存储叶子节点PriorityQueue<HuffmanNode> queue = new PriorityQueue<>();for (int i = 0; i < data.length; i++) {HuffmanNode node = new HuffmanNode(data[i], weight[i]);queue.offer(node);}// 构建哈夫曼树while (queue.size() > 1) {HuffmanNode left = queue.poll();HuffmanNode right = queue.poll();HuffmanNode parent = new HuffmanNode('\0', left.weight + right.weight);parent.left = left;parent.right = right;queue.offer(parent);}root = queue.poll();return root;}public String generateCode(HuffmanNode node, String code) {if (node == null) {return "";}if (node.left == null && node.right == null) {return code;}generateCode(node.left, code + "0");generateCode(node.right, code + "1");return code;}public String decode(String code) {StringBuilder result = new StringBuilder();HuffmanNode node = root;for (int i = 0; i < code.length(); i++) {if (code.charAt(i) == '0') {node = node.left;} else {node = node.right;}if (node.left == null && node.right == null) { result.append(node.data);node = root;}}return result.toString();}}```(3)Main类:```javaimport java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入字符串:");String input = scanner.nextLine();System.out.println("请输入字符及其权值(例如:a 2 b 3 c 5):"); String[] dataWeight = scanner.nextLine().split(" ");char[] data = new char[dataWeight.length / 2];int[] weight = new int[dataWeight.length / 2];for (int i = 0; i < dataWeight.length; i += 2) {data[i / 2] = dataWeight[i].charAt(0);weight[i / 2] = Integer.parseInt(dataWeight[i + 1]);}HuffmanTree huffmanTree = new HuffmanTree();HuffmanNode root = huffmanTree.buildHuffmanTree(data, weight); String code = huffmanTree.generateCode(root, "");System.out.println("编码结果:" + code);String decoded = huffmanTree.decode(code);System.out.println("解码结果:" + decoded);scanner.close();}}```3. 运行程序(1)编译并运行Main类,输入字符串和字符及其权值。
哈夫曼树的构造代码x#include<stdio.h>#include<malloc.h>//定义哈夫曼树节点typedef struct{tint weight;//权值tint lchild,rchild,parent;//子节点和双亲节点序号}HTNode;//定义哈夫曼树typedef struct{tHTNode *nodes;//节点数组tint length;//树的节点数}HuffmanTree;//创建哈夫曼树HuffmanTree *createHuffmanTree(int *set,int length){tint m,i,j,x1,x2;//m表示总节点数,x1和x2记录权值最小的两个节点tHuffmanTree *tree;tHTNode *node;tm=2*length-1;t//申请树的节点数组ttree=(HuffmanTree*)malloc(sizeof(HuffmanTree));tnode=(HTNode*)malloc(m*sizeof(HTNode));t//初始化tfor(i=0;i<m;i++)t{ttnode[i].parent=-1;ttnode[i].lchild=-1;ttnode[i].rchild=-1;ttif(i<length)tt{tttnode[i].weight=set[i];tt}ttelsetttnode[i].weight=0;t}t//建立哈夫曼树tfor(i=length;i<m;i++)t{tt//x1表示权值最小的节点序号,x2表示次最小节点的序号ttx1=0;ttx2=0;tt//找出权值最小的节点ttfor(j=0;j<i;j++)tt{tttif(node[j].parent==-1)ttt{ttttif((x1==0)||node[j].weight<node[x1].weight)tttt{tttttx1=j;tttt}ttt}tt}tt//找出权值次最小的节点ttfor(j=0;j<i;j++)tt{tttif(node[j].parent==-1)ttt{ttttif((x2==0)||node[j].weight<node[x2].weight&&x1!=j) tttt{tttttx2=j;tttt}ttt}tt}tt//建立一个新的节点ttnode[i].weight=node[x1].weight+node[x2].weight; ttnode[i].lchild=x1;ttnode[i].rchild=x2;ttnode[x1].parent=i;ttnode[x2].parent=i;t}ttree->nodes=node;ttree->length=m;treturn tree;}//打印哈夫曼树void printHuffmanTree(HuffmanTree *tree){tint i;tprintf('序号t权值t双亲t左孩子t右孩子');tfor(i=0;i<tree->length;i++)t{ttprintf('%dt%dt%dt%dt%d',i,tree->nodes[i].weight,tree->nodes[i].parent, ttttree->nodes[i].lchild,tree->nodes[i].rchild); t}}//释放哈夫曼树void clearHuffmanTree(HuffmanTree *tree){tif(tree==NULL)ttreturn;tfree(tree->nodes);tfree(tree);}int main(){tHuffmanTree *tree;tint set[7]={5,29,7,8,14,23,3};t//创建哈夫曼树ttree=createHuffmanTree(set,7);t//打印哈夫曼树tprintHuffmanTree(tree);t//释放哈夫曼树tclearHuffmanTree(tree);treturn 0; }。
哈夫曼编码树构建方法哈夫曼编码树(Huffman coding tree)是一种常用的数据压缩技术,通过利用字符出现的频率构建树结构来实现编码。
在本文中,我们将介绍哈夫曼编码树的构建方法,详细说明其原理和步骤,并以实例加以说明。
一、哈夫曼编码树的原理哈夫曼编码树的构建基于字符出现的频率,频率越高的字符编码越短。
该原理的关键在于使用较短的编码表示高频率的字符,从而实现数据压缩。
哈夫曼编码树是一棵二叉树,其中每个叶子节点表示一个字符,根据字符的频率形成不同深度的叶子节点。
通过从根节点到叶子节点的路径确定每个字符的编码。
二、哈夫曼编码树的构建步骤1. 统计每个字符的频率,得到字符频率表。
2. 将字符频率表转化为叶子节点集合。
3. 构建哈夫曼编码树的规则如下:- 从叶子节点集合中挑选两个频率最小的节点作为左右孩子,创建一个新的父节点。
- 将父节点的频率设置为左右孩子的频率之和。
- 将父节点加入叶子节点集合。
- 重复上述步骤,直到叶子节点集合中只剩一个节点,此节点即为根节点,哈夫曼编码树构建完成。
三、哈夫曼编码树构建实例以下是一个构建哈夫曼编码树的实例,假设有四个字符A、B、C、D及其对应的频率如下表所示:字符频率A 10B 20C 30D 401. 根据字符的频率,按照从小到大的顺序排序如下:A(10) < B(20) < C(30) < D(40)2. 从叶子节点集合中选取频率最小的两个节点A(10)和B(20),构建一个新的父节点AB(30)。
3. 更新叶子节点集合,得到如下序列:AB(30) < C(30) < D(40)4. 从叶子节点集合中选取频率最小的两个节点AB(30)和C(30),构建一个新的父节点ABC(60)。
5. 更新叶子节点集合,得到如下序列:ABC(60) < D(40)6. 从叶子节点集合中选取频率最小的两个节点D(40)和ABC(60),构建一个新的父节点ABCD(100)。
/******************************************************************** ***********------------Copyright (c) 2005 ~ 2010 Miartech. All Rights Reserved.------------********************************************************************* *************---------------------------------File Info------------------------------------** Last Modified Date: 2012-09-13** Descriptions:**QQ:408732013**------------------------------------------------------------------------------********************************************************************* **********/#include <stdlib.h>typedef struct BINARYTREE{u8 cValue;struct BINARYTREE * rchild;struct BINARYTREE * lchild;}t_Binary_Tree;extern uchar * g_pBuf; //the pointer of node array/******************************************************************** ************* Function Name: BitTreeCreat** Input Parameters: pnode: pointer of root** Output Parameters:None** Description: create a binary tree********************************************************************* **********/void BitTreeCreat(t_Binary_Tree ** pnode){t_Binary_Tree * t_newnode;if(*g_pBuf > END_SYMBOL){g_pBuf++;*pnode = NULL;return ;}t_newnode = (t_Binary_Tree *)malloc(sizeof(t_Binary_Tree));if(t_newnode == NULL)return ;*pnode = t_newnode ;t_newnode->cValue = *g_pBuf++;BitTreeCreat(&(t_newnode->lchild));BitTreeCreat(&(t_newnode->rchild));}/******************************************************************** ************* Function Name: Preorder** Input Parameters: pnode: root pionter of a binary tree** Output Parameters:None** Description: Preorder traversal********************************************************************* **********/void Preorder(t_Binary_Tree * pnode){if(pnode != NULL){UARTSendData(&(pnode->cValue), 1);DelayMs(5);Preorder(pnode->lchild);Preorder(pnode->rchild);}}/******************************************************************** ************* Function Name: Inorder** Input Parameters: pnode: root pionter of a binary tree** Output Parameters:None** Description: inorder traversal********************************************************************* **********/void Inorder(t_Binary_Tree * pnode){if(pnode != NULL){Inorder(pnode->lchild);UARTSendData(&(pnode->cValue), 1);DelayMs(5);Inorder(pnode->rchild);}}/******************************************************************** ************* Function Name: Afterorder** Input Parameters: pnode: root pionter of a binary tree** Output Parameters:None** Description: after order traversal********************************************************************* **********/void Afterorder(t_Binary_Tree * pnode){if(pnode != NULL){Afterorder(pnode->lchild);Afterorder(pnode->rchild);UARTSendData(&(pnode->cValue), 1);DelayMs(5);}}/******************************************************************** ************* Function Name: HaffmanTreeCreate** Input Parameters: cpbuf: the pointer of weigths array** clen: the length of weigths array** Output Parameters: root pointer of the haffmantree** Description: create a haffman tree********************************************************************* **********/t_Binary_Tree * HaffmanTreeCreate(uchar * cpbuf, uchar clen){uchar cCtr;uchar cFor;uchar cLenOfbuf;uchar cMin1;uchar cMin2;t_Binary_Tree * t_newtree;t_Binary_Tree * TreePtBuff[LEN_OF_ARRAY];/* create the binary tree array,the element is the node that no child */cLenOfbuf = clen;for(cCtr = 0; cCtr < cLenOfbuf; cCtr++){TreePtBuff[cCtr] = (t_Binary_Tree *)malloc(sizeof(t_Binary_Tree));TreePtBuff[cCtr]->cValue = *(cpbuf++);TreePtBuff[cCtr]->lchild = NULL;TreePtBuff[cCtr]->rchild = NULL;}/* create a haffman tree from the binary tree array */for(cCtr = 0; cCtr < (cLenOfbuf - 1); cCtr++){/* find the two minimum data of the ptree array */FindMin(TreePtBuff, cLenOfbuf - cCtr, &cMin1, &cMin2);/* combine the two min value node to a new node */t_newtree = (t_Binary_Tree *)malloc(sizeof(t_Binary_Tree));t_newtree->cValue = TreePtBuff[cMin1]->cValue + TreePtBuff[cMin2]->cValue;t_newtree->lchild = TreePtBuff[cMin2];t_newtree->rchild = TreePtBuff[cMin1];/* free the two min value node */free(TreePtBuff[cMin1]);free(TreePtBuff[cMin2]);/* insert the new node to the array, delete the empty element */if(cMin1 < cMin2){TreePtBuff[cMin1] = t_newtree;for(cFor = cMin2; cFor < (cLenOfbuf - cCtr - 1);cFor++){TreePtBuff[cFor] = TreePtBuff[cFor + 1];}}else{TreePtBuff[cMin2] = t_newtree;for(cFor = cMin1; cFor < (cLenOfbuf - cCtr - 1);cFor++){TreePtBuff[cFor] = TreePtBuff[cFor + 1];}}}return TreePtBuff[0]; // return the root of the haffman binary tree}/******************************************************************** ************* Function Name: FindMin** Input Parameters: ptree: the pointer of original binary tree array** clen: the length of array** num1: the first minimun data's serial number of the array ** num2: the second minimun data's serial number of the array ** Output Parameters: none** Description: find the two minimum data of the ptree array,return the num1 and** num2 ,ptree[num1] <= ptree[num2]********************************************************************* **********/void FindMin(t_Binary_Tree ** ptree, uchar clen, uchar * num1, uchar * num2){uchar cCtr;t_Binary_Tree ** t_ptree;t_ptree = ptree;*num1 = 0;*num2 = 1;for(cCtr = 0; cCtr < (clen - 1); cCtr++){if((t_ptree[cCtr + 1]->cValue) <= (t_ptree[*num1]->cValue)){*num2 = *num1;*num1 = cCtr + 1;}else if((t_ptree[cCtr + 1]->cValue) <= (t_ptree[*num2]->cValue)){*num2 = cCtr + 1;}else;}}/******************************************************************** ************* Function Name: FindLeaves** Input Parameters: proot: root pionter of a binary tree** Output Parameters:None** Description: print the leaves of the binary tree********************************************************************* **********/void FindLeaves(t_Binary_Tree * proot){if((proot->lchild == NULL) && (proot->rchild == NULL)){UARTSendData(&(proot->cValue), 1);DelayMs(5);return ;}FindLeaves(proot->lchild); FindLeaves(proot->rchild); }。