问题分析:huffman树即最优二叉树,问题不再详细描述了。下面说下实现的过程的要注意的问题。
1.先从森林中取出两个权值最小的结点(一个最小,一个次小)这两个结点作为一个双亲结点的两个孩子结点,双亲的权值为两个孩子结点权值之和。
2.把该双亲结点放回到森林,再去取出最小的结点(一个最小,一个次小),重复1过程,直到森林只剩一个结点。但此时并不是只剩一个结点,而是变成一棵树,
3.返回树的根结点,然后中序(或前序后序)遍历输出。
当只剩一个结点时出循环while(h->next!=NULL)
此时while的大循环里应该是1过程的重复
有两个注意点:
(1)为了方便起见:可以在结构体里面除了left域和right域外再加一个next域,这样你在输入叶子结点的时候就可以挂成一个链表。
(2)在循环里每重复1过程都要对链表进行排序,注意你的链表是否有头结点这些细节问题。
下面是核心代码
//有头结点的链表while循环终止条件为h->next->next==NULL
//没有头结点的链表while循环终止条件为h->next==NULL
while(h->next->next)
{
sort(h);//链表的排序
h1=h;
t=h->next;
q=t->next;
h=q->next;
q->next=NULL;
//创建一个双亲结点
p=(Huffman *)malloc(sizeof(Huffman ));
p->value=t->value+q->value;
p->left=t;
p->right=q;
//把该双亲结点放回森林,继续排序
p->next=h;
h1->next=p;
h=h1;
}
总结:编码之前先对问题分析清楚,磨刀不误砍柴工。理清思路,编码的时候还是要注意细节,比如你的链表有木有头结点,变量类型小问题等。