1. 程式人生 > >哈夫曼樹建立與求最短帶權路徑長度

哈夫曼樹建立與求最短帶權路徑長度

#include<stdio.h>
#include<stdlib.h>
#define n 7                      //假設有七個節點元素
struct Element
{
    int flag;
    int weight;
    int lchild,rchild,parent;                                   //每個節點均為五元組形式
}huffman[2*n-1];
int min(struct Element huffman[],int k)
{
    int i,p=k-1;
    int min=huffman[k-1].weight;
    for(i=k-2;i>=0;i--)
    {
        if(huffman[i].flag==0)
        {
            if(huffman[i].weight<min)
            {
                p=i;
                min=huffman[i].weight;
            }
        }
        else
            continue;
    }
    return p;
}
int min2(struct Element huffman[],int a,int k)
{
    int i,p,q;
    for(i=k-1;i>=0;i--)
    {
        if(huffman[i].flag==0)
            break;
    }
    p=i;
    q=i;
    int min2=huffman[p].weight;
    for(i=p-1;i>=0;i--)
    {
        if((huffman[i].flag==0)&&(i!=a))
        {
            if(huffman[i].weight<min2)
            {
                q=i;
                min2=huffman[i].weight;
            }
        }
        else
            continue;
    }
    return q;
}
void Hufftree(struct Element huffman[],int w[],int m)
{
    int a,b;
    int i,k;
    for(i=0;i<2*n-1;i++)
    {
        huffman[i].lchild=-1;                       //初始化
        huffman[i].rchild=-1;
        huffman[i].parent=-1;
        huffman[i].flag=0;
    }
    for(i=0;i<n;i++)
    {
        huffman[i].weight=w[i];                      //將陣列中元素賦給每個節點的權值
    }
    k=7;
    for(k=n;k<2*n-1;k++)
    {
        a=min(huffman,k);                         //找出最小元素
        b=min2(huffman,a,k);                  //找出第二小元素
        huffman[a].parent=k;
        huffman[b].parent=k;
        huffman[a].flag=1;
        huffman[b].flag=1;
        huffman[k].weight= huffman[a].weight+huffman[b].weight;
        huffman[k].lchild=a;
        huffman[k].rchild=b;
    }
    for(i=0;i<13;i++)
    {
          printf("%d ",huffman[i].weight);
    }
    printf("\n");
}
int road(struct Element huffman[],int m)
{
    int h,i,sum=0;
    for(i=0;i<n;i++)
    {
        h=depth(huffman,i);
        sum=sum+huffman[i].weight*h;
    }
    return sum;
}
int depth(struct Element huffman[],int i)
{
    int level=0,j=i;
    while(huffman[j].parent>-1)
    {
        level++;
        j=huffman[j].parent;
    }
    return level;
}
main()
{
    int i;
    int length;
    int m=n;
    struct Element huffman[2*n-1]={0};;
    int w[n]={31,16,8,10,11,4,20};
    Hufftree(huffman,w,m);                     //構建哈夫曼樹
    length=road(huffman,m);
    printf("帶權路徑長度為:%d",length);
}