【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

前面说到了哈夫曼树的创建,那下面一个重要的环节就是哈夫曼树的排序问题。但是由于排序的内容是数据结构,因此形式上说,我们需要采用通用数据排序算法,这在我之前的博客里面已经涉及到了(通用算法设计)。所以,我们所要做的就是编写compare和swap两个函数。通用冒泡代码如下所示,

void bubble_sort(void* array[], int length, int (*compare)(void*, void*), void(*swap)(void**, void**))
{int outer;int inner;for(outer = length -1; outer >0; outer --){for(inner = 0; inner < outer; inner ++){if(compare(array[inner], array[inner + 1]))swap(&array[inner], &array[inner + 1]);}}return;
}

compare和swap代码如下所示,

int compare (void* a, void* b)
{HUFFMAN_NODE* node1 = (HUFFMAN_NODE*)a;HUFFMAN_NODE* node2 = (HUFFMAN_NODE*)b;return node1->frequence > node2->frequence ? 1 : 0;
}void swap(void** a, void** b)
{HUFFMAN_NODE* median;HUFFMAN_NODE** node1 = (HUFFMAN_NODE**)a;HUFFMAN_NODE** node2 = (HUFFMAN_NODE**)b;median = *node1;*node1 = *node2;*node2 = median;
}

有了创建函数和排序函数,那么哈夫曼树就可以创建了,

HUFFMAN_NODE* create_huffman_tree(HUFFMAN_NODE* huffmanNode[], int length)
{HUFFMAN_NODE* head = NULL;if(NULL == huffmanNode ||  length <= 1)return NULL;while(length > 1){bubble_sort((void**)huffmanNode, length, compare, swap);head = create_new_node('\0',  huffmanNode[0]->frequence + huffmanNode[1]->frequence);assert(NULL != head);head->left = huffmanNode[0];head->right = huffmanNode[1];huffmanNode[0]->parent = head;huffmanNode[0]->symbol = 1;huffmanNode[1]->parent = head;huffmanNode[1]->symbol = 0;memmove(&huffmanNode[0], &huffmanNode[2], sizeof(HUFFMAN_NODE*) * (length -2));huffmanNode[length -2] = head;length --;}return head;
}

上面的代码完整了写出了huffman树的创建过程,那么我们怎么知道符号的编码是多少呢?这其实不难,因为根节点都知道了,我们只要按照自下而上的顺序遍历节点就可以打印出编码,只不过编码是逆序的而已,

void print_code_for_str(HUFFMAN_NODE* pNode, HUFFMAN_NODE* head)
{if(NULL == pNode || NULL == head)return;while(head != pNode){printf("%d", pNode->symbol);pNode = pNode->parent;}return;
}

如果对代码本身还有怀疑,可以编译一个测试用例验证一下,

void test()
{HUFFMAN_NODE* node1 = NULL;HUFFMAN_NODE* node2 = NULL;HUFFMAN_NODE* node3 = NULL;HUFFMAN_NODE* node4 = NULL;HUFFMAN_NODE* test[] = {node1 = create_new_node('a', 0.1),node2 = create_new_node('b', 0.2),node3 = create_new_node('c', 0.3),node4 = create_new_node('d', 0.4),};HUFFMAN_NODE* head = create_huffman_tree(test, sizeof(test)/sizeof(HUFFMAN_NODE*));print_code_for_str(node1, head);print_code_for_str(node2, head);print_code_for_str(node3, head);print_code_for_str(node4, head);
}

总结:

(1)哈夫曼树不复杂,如果手算可以成功,那么编程应该也没有什么问题

(2)复杂算法都是由小算法搭积木而成的,朋友们应该在基本算法上打下坚实的基础

(3)算法注意复用,这里就用到了原来讲到的通用算法内容

一步一步写算法(之哈夫曼树 下)相关推荐

  1. 数据结构与算法学习④(哈夫曼树 图 分治回溯和递归)

    数据结构与算法学习④(哈夫曼树 图 回溯和递归 数据结构与算法学习④ 1.哈夫曼树 1.1.相关概念 1.2.哈夫曼树的构建 1.3.哈夫曼编码 1.4.面试题 2.图 2.1.图的相关概念 2.2. ...

  2. 【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

    超详细讲解哈夫曼树(Huffman Tree)以及哈夫曼编码的构造原理.方法,并用代码实现. 1哈夫曼树基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径. 结点的路径长度:两 ...

  3. Java数据结构和算法:哈夫曼树

    本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若 ...

  4. 【大话数据结构算法】哈夫曼树

    哈夫曼树又称为最优二叉树. 1.路径和路径长度 在一棵树中,从一个节点往下可以达到的孩子或者子孙节点之间的通路称为路径.通路中分支的数目称为路径长度.若规定根节点的层数为1,则从根节点 到第L层节点的 ...

  5. 【数据结构与算法】哈夫曼树的Java实现

    哈夫曼树 最优二叉树也称哈夫曼树,讲的直白点就是每个结点都带权值,我们让大的值离根近.小的值离根远,实现整体权值(带权路径长度)最小化. 哈夫曼算法的思想我认为就是上面讲的,而它的算法实现思路是这样的 ...

  6. 《数据结构与算法之哈夫曼树(Java实现)》

    说在前头: 本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...

  7. 18.C#写算法之“哈夫曼编码” 是什么鬼?

    文章参考自:程序员小灰:漫画:"哈夫曼编码" 是什么鬼? 哈夫曼编码是一种高效的编码方式,在信息存储和传输过程中,用于对信息进行压缩. 计算机系统是如何存储信息的呢? 计算机不是人 ...

  8. 【数据结构和算法】赫夫曼树 | 实战演练

  9. 【数据结构和算法】赫夫曼树 | 实战演练(二)

最新文章

  1. 热闹的聚会与尴尬的聚会_如何增加(和保存)您最喜欢的技术聚会
  2. 防止酒后删库!日本人用 3 小时做了个酒精测试软件
  3. vs2005c语言连接mysql_VS2005连接MySQL C API
  4. 创建springboot出现error:connection timed out创建springboot报错显示连接超时解决方案
  5. zabbix proxy安装配置
  6. 2招按摩轻松解除黑眼圈 - 健康程序员,至尚生活!
  7. HarmonyOS应用开发——使用HUAWEI DevEco Studio创建第一个程序 HELLO WORLD!
  8. 插画素材|萌化!超可爱的动物主题手绘复古插画
  9. 终于找到个好办法备份数据库了
  10. Comparable接口
  11. 手机上编写Java程序的软件
  12. 最新去广告扒站仿站网源码
  13. 嵌入式开发必须学习qt吗?
  14. Android大作业:安卓开发图书管理系统APP
  15. Compact set,紧集,闭集,开集
  16. 醉梦尘缘,花落为谁伤
  17. 计算机题库一级第四,计算机一级题题库,第四章Excel
  18. 【1652. 拆炸弹】
  19. android9壁纸存放路径,Android基础入门教程——10.9 WallpaperManager(壁纸管理器)
  20. 【计算机网络】第五话·物理层的底层设备❥超详解

热门文章

  1. cordova插件(github版)
  2. 黄聪:wordpress博客用Slimbox2实现lightbox效果(免插件)(转)
  3. OpenCV2.3.1 VS 安装
  4. Linux合上笔记本不进入休眠模式
  5. Python minidom模块(DOM写入和解析XML)
  6. org.hibernate.AnnotationException: mappedBy reference an unknown target entity property
  7. mysql实现自增函数
  8. LinkedHashMap,HashMap,TreeMap
  9. 《网络攻防》 第六周学习总结
  10. 微信小程序之----问题