对于一个共有n个结点、K条边的森林,共有几棵树?
由一颗树的性质:结点等于边+1【n= k+ 1】。
等价于 n - k =1。
故共有 n - k 棵树。
基本概念
路径:从一个结点到另一个结点之间的分支序列。
路径长度:从一个结点到另一个结点所经过的分支数目。
结点的权值:树中每个结点所赋予的具有某种实际意义的实数,
带权路径长度:从根到某一结点的路径长度与该结点权值的乘积。
树的带权路径长度:树中从根到所有叶子结点的各个带权路径长度之和。
最优二叉树:
在叶子个数 n 以及各叶子权值Wi确定的条件下、树的带权路径长度WPL值最小的二叉树称为最优二叉树。
最优二叉树的特点:权值越大、离根越近。
哈夫曼树的定义
哈夫曼树是由 n 个带权叶子结点所构成的所有二叉树中带权路径长度最短的二叉树。
构造哈夫曼树的算法步骤
哈夫曼树的特点
没有度为1的结点
n个叶子结点的哈夫曼树共有2n-1个结点(生成n-1个非叶子结点)
哈夫曼树的任意非叶子结点的左右子树交换后仍是哈夫曼树
对同一组权值 {W1,W2,......Wn} 、存在不同结构的两颗哈夫曼树、但他们的带权路径长度(WPL)一定是一样的
哈夫曼树的类型定义
n个叶子结点的哈夫曼树共有2n-1个结点,因此可用有2n-1个元素的一维数组来存储哈夫曼树的各个结点,结点间的父
子关系用下标来指示;在使用哈夫曼树进行编码和译码时,既要用结点的双亲信息,又要用结点的孩 信息,所以采用
静态三叉链表来存储哈夫曼树。
哈夫曼树的算法实现
初始化:先将n个元素都视为根结点,即孩子和双亲指针全置0。
建哈夫曼树的过程是:反复在数组中选双亲为0(表示它们当前是树根)且权值最小的两结点,将它们作为左右孩子挂在
新的结点之下,新结点权值为左右孩子权值之和。
依次循环往复
哈夫曼树编码基本概念
在信息传输等实际应用中,需要将文本中出现的字符进行二进制编码,传输过后,又要将二进制码翻译为原先的字
符,这就是典型的编码和译码问题。
在编码的设计中,通常遵守两个原则:
(1)/编码能够唯一地被译码。
(2〉编码长度要尽可能的短。
利用哈夫曼树可以得到平均长度最短的编码,因此在信息传输、数据压缩等方面,哈夫曼树有着广液的应用。
前缀编码:任何一个字符的编码都不是另一个字符的编码的前缀,这种编码方式称为前缀编码。
如何进行哈夫曼编码
————哈夫曼树是树的带权路径长度值为最小的二叉树,其特点就是:叶子结点权值越大,离根越近。
————构造不等长编码的原则是:字符使用频率越高,编码越短。
————用哈夫曼树设计编码的设想是:
每个待编码的字符对应一个叶子结点;每个字符的使用频率对应叶子的权值;每个字符的编码对应根到叶子的路径;
对哈夫曼树中每个左分支赋予0,右分支赋予1,则从根到每个叶子的路径上,各分支的值构成该叶子结点的哈夫曼
编码。
例:若要传输如下单词
state, seat, act, tea, cat, set, a, eat
如何使所传送的信息编码长度最短?
为保证信息编码长度最短,先统计各字符出现的次数,然后以此作为权值,构建哈夫曼树。
结论一:哈夫曼编码是前缀码。
字符不同则对应的叶子不同,因为从根到每个叶子的路径是不同的,所以根到一个叶子的路径不可能是到另一个叶子
路径的前段,即一个字符的编码不可能是另一个字符编码的前缀,因此哈夫曼编码是前缀码。
结论二:哈夫曼编码是最优前缀码。
哈夫曼编码的构造及算法实现
哈夫曼编码的译码