二叉树的一个重要应用——赫夫曼树(最优二叉树),即所有叶子结点的平均带权路径最短。
赫夫曼算法叙述如下:
(1)根据给定的n个权值{w1,w2,...wn}构成n棵二叉树的集合F={T1,,T2,...,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均空;
(2)在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和;
(3)在F中删除这两棵树,同时将新得到的二叉树加入F中;
(4)重复(2)和(3),直到F只含一棵树为止。这棵树便是赫夫曼树。
程序中赫夫曼用顺序存储结构,赫夫曼编码用二维数组。
定义结构体:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct HTNod