结点定义:

 /*
* 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. mysql 更新数据表的记录

    对于表里的记录值,可以通过update 命令进行更改,语法如下: UPDATE tablename SET field1=value1,field2.=value2,……fieldn=valuen [ ...

  2. MySQL 数据库 分页查询

    在使用MySQL 进行数据库分页查询的时候最主要是使用LIMIT子句进行查询: 首先来看一下LIMIT: LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两 ...

  3. unity, texture import settings

    如果图片带透明通道,则若勾选Alpha Is Transparency,图片会呈现透明的预览效果.   但Alpha Is Transparency勾选与否是否影响shader的输出效果目前我还不太清 ...

  4. C++ 链接Mysql 函数介绍

    通过MySQL自己的API函数进行连接 1.使用API的方式连接,需要加载mysql的头文件和lib文件.在VS2010的附加包含目录中添加\MySQL\MySQL Server 5.1\includ ...

  5. MFC程序开始的执行过程详述

    1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数.而在MFC程 ...

  6. jquery定时器的简单代码

    当收到消息的时候能够及时的刷新,显示收到消息的条数,下面与大分享下使用简单的代码实现jquery定时器 简单的代码实现jquery定时器. 今天,项目遇到一个消息的模块,在导航条最上面.想实现,当收到 ...

  7. Mvc4 Layout布局与页面SEO信息title,keyword,description

    工作已经五个年头了,在进入工作岗位时最初在.net 2.0平台一直到现在的.net 4.0平台下,开发了不少的winform.webform项目:五年的工作时间,在公司主持开发和维护了不少的电子商务w ...

  8. tortoisegit 7步 学会git分支

    tortoisegit 7步 学会git分支 做自己的产品,分支还是很重要的.例如,我发布了一个app,但是有bug,又想做新功能,怎么办呢?如果只在一个git上开发的话,bug会越来越多,原来bug ...

  9. 使用JQuery获取被选中的checkbox的value值 以及全选、反选

    以下为使用JQuery获取input checkbox被选中的值代码: <html> <head> <meta charset="gbk"> & ...

  10. sqlserver 若字段定义的类型为datetime

    sqlserver 若字段定义的类型为datetime,插入为''(空),那么会默认值为1900-01-01 00:00:00.000 解决 插入 NULL 或者程序判断