赫夫曼树,又称最优树,是一类带权路径长度最短的树,有着广泛的应用。
设二叉树具有n个带权值的叶子结点,从根结点到各个叶子结点的路径长度与对应叶子结点权值的乘积之和叫做二叉树的带权路径长度。
对于一组带有确定权值的叶子结点,带权路径长度最小的二叉树称为最优二叉树。
构造赫夫曼树:
1、创建n个根结点,权值{w1,w2,,,wn},得森林{T1,T2,Tn};
2、在森林中选取根结点权值最小的两颗二叉树归并为新二叉树,新二叉树根结点权值为两权值之和。
3、将新二叉树加入森林,同时忽略被归并的两颗二叉树。
4、重复2和3,至森林只有一颗二叉树。该二叉树就是赫夫曼树。
应用:赫夫曼编码。
以前,进行快速远距离通信的主要手段是电报,即将需传送的文字转换成由二进制的字组成的字符串。当然,在传送电文时,希望总长尽可能地短。而赫夫曼编码就是一种最优前缀编码。
输入:字符的数目以及相应的权值.
输出:每个字符对应的赫夫曼编码。
运行结果:
赫夫曼树的存储结构定义:含n个字符则赫夫曼树有2*n-1个结点,个数固定,编码和解码无增删,故赫夫曼树采用动态分配的顺序存储结构,构造树时从叶子结点逐步往上走,识别字符或者说解码时从根往下走,故结点要含双亲和左右孩子下标,当然还要有权值。
首先是辅助宏的定义: