哈夫曼树
基本概念
哈夫曼树即最优二叉树,指一类带权路径长度最短的树,其中每个结点的带权路径长度为,结点到树根之间的路径长度与结点权值的乘积。树的带权路径长度即为所有结点之和,写作:
WPL=Σ wiLi
带权路径长度WPL最小的二叉树即为哈夫曼树。
哈夫曼树的构造
算法描述:
1、根据给定的n个权值{w1,w2,…,wn}构成n棵二叉树的集合F={T1,T2,…,Tn},其中Ti中只有一个权值为wi的根节点,左右子树均为空。
2、在F中选取两棵根节点的权值最小的树作为左、右子树,构造一棵新的二叉树,且让新的二叉树根节点的权值为左右子树根节点之和。
3、在F中删除这两棵树,同时将新的二叉树放到F中。
4、重复2、3条,直到F中只剩下一棵树。这棵树就是哈夫曼树。
一个有n个叶子结点的初始集合,要生成哈夫曼树要进行n-1次合并,产生n-1个新结点。最终求得的哈夫曼树的二叉树共有2n-1个结点。
#define N 6 //叶子结点个数
#define M 2N-1 //结点总数
#define EPS 1e-5
typedef char datatype;
typedef struct{
float weight; //结点权值
datatype data; //结点内容
int lchild,rchild,parent; //parent可用来指示进行了合并操作
}hufmtree;
hufmtree tree[M];
void Huffmantree(hufmtree tree[]){
int i,j,p1,p2;
char ch;
float small1,small2,f;
for(i=0;i<M;i++){
//初始化
tree[i].lchild=-1;
tree[i].rchild=-1;
tree[i].parent=-1;
tree[i].weight=0.0;
tree[i].data='0';
}
for(i=0;i<N;i++){
//输入每个点的内容和权值
scanf("%f",%f);
tree[i].weight=f;
scanf("%c",&ch);
tree[i].data=ch;
}
for(i=0;i<M;i++){
p1=p2=0;
small1=small2=Maxval; //Maxval是float类型的最大值
for(j=0;j<i;j++){
if(tree[j].parent==-1){
if(tree