huffman树的分析


    问题分析: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;
}

    总结:编码之前先对问题分析清楚,磨刀不误砍柴工。理清思路,编码的时候还是要注意细节,比如你的链表有木有头结点,变量类型小问题等。


猜你喜欢

转载自blog.csdn.net/smallsun_229/article/details/41757545