结点定义:

 /*
* 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 添加列的索引

    无论哪种模式加入索引.会大幅度增加SELECT速度 索引名:Index_User_Name 栏目名:user_name 索引类型:Nornal 索引方式:BTREE

  2. java的多线程(一)

    我们知道我们打开个程序(或者说运行一款软件)其实也就是创建了一个进程,只不过程序是静态指令的集合,而进程是正在系统中运行的指令集合,进程是系统进行资源分配与调度的一个独立单位.进程具有独立性,动态性, ...

  3. unity, shader input and output

    http://wiki.unity3d.com/index.php?title=Shader_Code

  4. unity, 延迟执行代码

    使用协程实现比较方便,可以带参数. void Start(){ StartCoroutine(delayLaunchRocket(rocket,2.0f)); } IEnumerator delayL ...

  5. &lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式

    又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章 ...

  6. .NET Remoting中的通道注册

    今天我的同事使用Remoting注册一个新通道.奇怪的是,通道始终无法注册,总是报告异常“该通道已被占用”.我明白这个异常出现的原因,但不明白的是此时系统并未使用任何一个通道,为何会有这个异常呢?即使 ...

  7. 在IntentService中使用Toast与在Service中使用Toast的异同

    1. 表象 Service中能够正常显示Toast,IntentService中不能正常显示Toast.在2.3系统上,不显示toast,在4.3系统上,toast显示.可是不会消失. 2. 问题分析 ...

  8. android studio - 解决Android Studio不停的Indexing的问题

    File > Invalidate Caches/Restart

  9. java 多线程5: java 终止线程及中断机制 (stop()、interrupt() 、interrupted()、isInterrupted())

    JAVA中有3种方式可以终止正在运行的线程 ①线程正常退出,即run()方法执行完毕了 ②使用Thread类中的stop()方法强行终止线程.但stop()方法已经过期了,不推荐使用 ③使用中断机制i ...

  10. PowerShell中实现人机交互

    编写脚本的过程中有很多时候需要进行人机交互,比如我写一个脚本,需要动态的输入一些内容,比如用户名和密码之类的东西,这些是没办法事先写进代码里的.而通过外部文件进行信息读取,友好性又差了点.所以当我们需 ...