Huffman算法-二叉树的应用

假设有一组实数,现在要构造一颗以Wi为权的m个外部结点的扩充二叉树,使得带权的外部路径长度WPL最小。满足这一要求的扩充二叉树就称为Huffman数或最优二叉树。

 

声明:

#include<stdio.h>
#include<malloc.h>

typedef struct node{
    int data;
    struct node *lchild,*rchild,*next;
}hufnode;

typedef hufnode *linkhuf;

 

/****************************************************/
/* huffman树 */
/****************************************************/
linkhuf Creat_Node(int n) //创建一单链表
{
    linkhuf head,pre,p;
    int x;
    head=NULL;
    printf("请按从小到大排列。\n");
    while(n--)
    {
        printf("请输入权值:");
        scanf("%d",&x);
        p=(linkhuf)malloc(sizeof(hufnode));
        p->data=x;
        p->lchild=NULL;
        p->rchild=NULL;
        if(NULL==head)
        {
            head=p;
            pre=head;
        }
        else
        {
            p->next=pre->next;
            pre->next=p;
            pre=pre->next;
        }
    }
    pre->next=NULL;
    printf("已经完成链表的创建。");
    return head;
}

 

linkhuf insert(linkhuf root , linkhuf s)//将结点S插入到有序Huffman root中。
{
    linkhuf p1,p2;
    if(NULL == root ) root=s;
    else
    {
        p1=NULL;
        p2=root;
        while(p2&&p2->data<s->data)
        {
            p1=p2;
            p2=p2->next;
        }
        s->next=p2;
        if(NULL==p1)
        {
            root=s;
        }
        else
        {
            p1->next=s;
        }
    }
    return root;
}

 

void Preorder1(linkhuf t)
{
    if(t!=NULL)
    {
        printf("%-6d",t->data);
        Preorder1(t->lchild);
        Preorder1(t->rchild);
    }
}
void creathuffman(linkhuf *root)//构造Huffman树。
{
    linkhuf s, rl,rr;
    while((*root && (*root)->next)!=NULL)
    {
        rl=*root;
        rr=(*root)->next;
        if (rr!=NULL) {
            *root=rr->next;
        }
        
        s=(linkhuf)malloc(sizeof(hufnode));
        s->next=NULL;
        s->data=rl->data+rr->data;
        s->lchild=rl;
        s->rchild=rr;
        rl->next=rr->next=NULL;

        *root=insert(*root,s);
    }
}

测试:

int main()
{
    linkhuf root;
    int n;
    printf("请输入链表结点:\n");
    scanf("%d",&n);
    root=Creat_Node(n);

    creathuffman(&root);
    Preorder1(root);
    printf("\n");
    return 0;
}

结果:

posted on 2012-05-14 12:05  yucong  阅读(340)  评论(0)    收藏  举报

导航