结点定义:

 /*
* Huffman树结点定义
*/
struct Node
{
ElementType weight; // 结点的权值
struct Node *leftChild; // 结点的左指针
struct Node *rightChild; // 结点的右指针
};

根据给定权值数组,构建一个Huffman树:

 /*
* 输出内存申请失败的消息
*/
void showFailureMessage()
{
printf("Memory allocate failure!\n");
exit(-);
} /*
* 根据数组获取数组的长度
*/
int getArrayLength(ElementType weights[])
{
} /*
* 对程序运行中申请的内存空间做事后处理
*/
void destroy(struct Node **)
{
} /*
* 为给定权值数组创建一个Huffman树,返回根结点指针
*/
Node * createHuffmanTree(ElementType weights[])
{
/* 根据传入的数组初始化 */
int arrayLength = getArrayLength(weights);
struct Node **nodePointerArray = (struct Node **)malloc(sizeof(struct Node *) * arrayLength);
if(nodePointerArray == NULL)
showFailureMessage();
for(int index = ; index < arrayLength; ++index) { // 初始化指针数组nodePointerArray,每个指针指向一个二叉树结点
nodePointerArray[index] = (struct Node *)malloc(sizeof(struct Node));
if(nodePointerArray[index] == NULL)
showFailureMessage();
nodePointerArray[index]->weight = weights[index]; // 是树中各结点权值与传入的数组weights中元素一一对应
nodePointerArray[index]->leftChild = nodePointerArray[index]->rightChild = NULL;
} /* 在初始化基础上进行(数组长度-1)次操作构造Huffman树 */
struct Node * rootNode = NULL;
for(int index = ; index < arrayLength; ++index) {
/* 找到自index后的最小值和次小值索引 */
int lowestIndex = index;
int lowSecondIndex = index + ;
for(int innerIndex = lowSecondIndex; innerIndex < arrayLength; ++innerIndex) {
if(nodePointerArray[innerIndex]->weight < nodePointerArray[lowestIndex]->weight) {
lowSecondIndex = lowestIndex;
lowestIndex = innerIndex;
} else if(nodePointerArray[innerIndex]->weight < nodePointerArray[lowSecondIndex]->weight) {
lowSecondIndex = innerIndex;
}
} /* 将最小值和次小值所对应的结点(或子树的根结点)生成一颗二叉树 */
rootNode = (struct Node *)malloc(sizeof(struct Node));
if(rootNode == NULL)
showFailureMessage();
rootNode->weight = nodePointerArray[lowestIndex]->weight + nodePointerArray[lowSecondIndex]->weight;
rootNode->leftChild = nodePointerArray[lowestIndex];
rootNode->rightChild = nodePointerArray[lowSecondIndex]; /* 此次生成二叉树后,对本次循环的索引值、最小值的索引值、次小值的索引值
* 所对应的结点做事后处理(此处巧用最小值和次小值所在结点需要移除) */
nodePointerArray[lowestIndex] = rootNode;
nodePointerArray[lowSecondIndex] = nodePointerArray[index];
nodePointerArray[index] = NULL;
}
destroy(nodePointerArray); return rootNode;
}

Huffman树求得树中各字符编码:

 /**
* 由给定的编码Huffman树求得树中各字符编码的算法,并分析器复杂度
**/
void HuffmanCode(Node *root, int index)
{
static int code[SIZE]; // code存放字符编码,其长度等于树的深度
if(root != NULL) {
if(root->leftChild == NULL && root->rightChild == NULL) {
cout << "Weight:" << root->data << " coding:";
for(int in = ; in < SIZE; ++in) // 输出叶子结点的编码
cout << code[in];
count << endl;
} else {
code[index] = ;
HuffmanCode(root->leftChild, (index + )); // 对左子树搜索
code[index] = ;
HuffmanCode(root->rightChild, (index + )); // 对右子树搜索
}
}
}

OK哒!O(∩_∩)O哈!

Huffman树的更多相关文章

  1. NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树

    抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了-- 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec  Memory Limit: ...

  2. 【数据结构】Huffman树

    参照书上写的Huffman树的代码 结构用的是线性存储的结构 不是二叉链表 里面要用到查找最小和第二小 理论上锦标赛法比较好 但是实现好麻烦啊 考虑到数据量不是很大 就直接用比较笨的先找最小 去掉最小 ...

  3. [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. Huffman树与编码的简单实现

    好久没写代码了,这个是一个朋友问的要C实现,由于不会C,就用JAVA写了个简单的.注释掉的代码属性按照原来朋友发的题里带的参数,发现没什么用就给注释掉了. package other; import ...

  5. Huffman树的编码译码

    上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffma ...

  6. HUFFMAN 树

    在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码. 首先介绍什么 ...

  7. Huffman树及其应用

    哈夫曼树又称为最优二叉树,哈夫曼树的一个最主要的应用就是哈夫曼编码,本文通过简单的问题举例阐释哈夫曼编码的由来,并用哈夫曼树的方法构造哈夫曼编码,最终解决问题来更好的认识哈夫曼树的应用--哈夫曼编码. ...

  8. poj 3253 Fence Repair(模拟huffman树 + 优先队列)

    题意:如果要切断一个长度为a的木条需要花费代价a, 问要切出要求的n个木条所需的最小代价. 思路:模拟huffman树,每次选取最小的两个数加入结果,再将这两个数的和加入队列. 注意priority_ ...

  9. Huffman树与最优二叉树续

    OK,昨天我们对huffman数的基本知识,以及huffman树的创建做了一些简介,http://www.cnblogs.com/Frank-C/p/5017430.html 今天接着聊: huffm ...

  10. 数据结构之Huffman树与最优二叉树

    最近在翻炒一些关于树的知识,发现一个比较有意思的二叉树,huffman树,对应到离散数学中的一种名为最优二叉树的路径结构,而Huffman的主要作用,最终可以归结到一种名为huffman编码的编码方式 ...

随机推荐

  1. scrapy 的框架的安装

    1.简介: scrapy 是用python写成的一个web 爬虫框架,scrapy 会把大多数在爬取网站时的通用的事给自动化的做了:我最开始爬别人的网站的时候 用的是requests这个库,用这个库我 ...

  2. 如何学习Linux

    为啥我们要学习Linux 技术的价值不在于这个技术有多么高超,而在于技术本身给我们带来什么价值,所以很多时候我们学习一个技术,不能盲目学,是为了使用这个技术,知道这个技术的使用场景,知道这个技术带来的 ...

  3. hdu4901The Romantic Hero

    #include<iostream> #include<map> #include<string> #include<cstring> #include ...

  4. SQL中的LIKE中用参数化查询

    今天终于学会怎么在like中用参数化查询啦..哈哈..再也不用担心sql注入了...  

  5. 恶意程序入侵 dbuspm-session 发现了新的方法制这种恶意程序

    直接从一台没服务器上把这两文件scp到当前的服务器上并替换这两个程序就ok了!!!!这种方法测试成功!!!! 出现了一个比效麻烦的事,服务器的负载正常,内存也正常,但就是很卡. 通过查找到线索:htt ...

  6. android笔记-----消息提示

    在/res/values目录下的文件中定义要显示的字符串,主要是考虑到后期可能需要换成英文之类的 <string name="login_checkBlank">用户名 ...

  7. 什么是GC Roots

    GC Root 2012年11月28日  ⁄ 综合 ⁄ 共 625字 ⁄ 字号  小 中 大  ⁄ 评论关闭   常说的GC(Garbage Collector) roots,特指的是垃圾收集器(Ga ...

  8. C/C++中获取数组的长度

    C/C++中没有提供直接获取数组长度的函数.对于存放字符串的字符数组,可用strlen函数获取长度. 如:char a[]="hello world";int count = st ...

  9. eclipse手动build整个project

    eclipse默认是自动build你所编辑的java文件,但是这种自动build的前提是你对该java文件做了修改,因此,有的时候,如果你的class文件因为某种原因丢失了,你又不去手动build,e ...

  10. JVM 内存分配机制总结

    大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区),Heap(堆),Program Counter Register(程序计数器), VM Stack(虚拟机栈,也 ...