数据结构基础5.5:哈夫曼树(HuffmanTree)的构造
2015-11-10 18:34
337 查看
一:哈夫曼树的定义
哈夫曼树,也叫最优二叉树,是WPL(带权路径长度)最小的树。
二:哈夫曼树的特点
1. 没有度为1的结点;
2. n个叶子结点的哈夫曼树共有2n - 1个结点;
3. 哈夫曼树的任意非叶结点的左右子树交换后仍是哈夫曼树;
三:哈夫曼树的构造
代码如下,内部部分函数实现请参考上一篇博客中的堆操作。
哈夫曼树,也叫最优二叉树,是WPL(带权路径长度)最小的树。
二:哈夫曼树的特点
1. 没有度为1的结点;
2. n个叶子结点的哈夫曼树共有2n - 1个结点;
3. 哈夫曼树的任意非叶结点的左右子树交换后仍是哈夫曼树;
三:哈夫曼树的构造
代码如下,内部部分函数实现请参考上一篇博客中的堆操作。
typedef struct HuffmanNode { int weight; struct HuffmanNode *lchild, *rchild; } *HuffmanTree; /* 哈夫曼树的构造实现在堆操作的基础上实现,所以内部子函数实现请参考上一篇博客中堆的实现方法 */ HuffmanTree Huffman(minheap mh) { int i; HuffmanTree T; if(!mh) return NULL; /* 按照权值构造最小堆 */ BuildMinHeap(mh); /* 做mh->size次合并 */ for(i = 0; i < mh->size; i++) { if(!(T = (HuffmanTree)malloc(sizeof(struct HuffmanNode)))) exit(1); /* 从最小堆中删除最小值作为左子节点 */ T->lchild = DeleteHeap(mh); /* 从最小堆中删除最小值作为右子节点 */ T->rchild = DeleteHeap(mh); /* 计算新权值 */ T->weight = T->lchild->weight + T->rchild->weight; /* 将新的结点插入最小堆 */ InsertHeap(mh, T); } /* 得到哈夫曼树的树根 */ T = DeleteHeap(mh); return T; }
相关文章推荐
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- 数据结构之Treap详解
- 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)
- java数据结构和算法学习之汉诺塔示例
- Java数据结构及算法实例:三角数字
- Java数据结构之简单链表的定义与实现方法示例
- 浅析栈区和堆区内存分配的区别
- 数据结构之AVL树详解