哈夫曼树

#include

const int n = 5;

typedef struct

{

    int weight;

    int parent,lchild,rchild;

}element;

char ch[n] = {‘A’,’B’,’C’,’D’,’E’};

int w[n] = {35,25,15,15,10};

void HuffmanTree(element huffTree[])

{

    int i,k;

    int i1,i2;

    for(i=0;i<2*n-1;i++)

    {

        huffTree[i].parent = -1;

        huffTree[i].lchild = -1;

        huffTree[i].rchild = -1;

    }

    for(i=0;i<n;i++)

        huffTree[i].weight = w[i];            //初始化,构造n课只含根结点的二叉树

    for(k=n;k<2*n-1;k++)            //进行n-1次合并

    {

        Select(huffTree,k,i1,i2);

        huffTree[k].weight = huffTree[i1].weight + huffTree[i2].weight;

        huffTree[i1].parent = k;                    //将i1、i2合并,双亲为k

        huffTree[i2].parent = k;

        huffTree[k].lchild = i1;

        huffTree[k].rchild = i2;

    }

}

void Select(element huffTree[],int k,int &i1,int &i2)

{

    int min1 = min2 = 100;

    for(int i=0;i<k,i++)

    {

        if(huffTree[i].parent == -1)

        {

            if(huffTree[i].weight < min1)

            {

                min2 = min1;i2 = i1;

                min1 = huffTree[i].weight;i1 = i;

            }else if(huffTree[it].weight < min2)

            {

                min2 = huffTree[i].weight;

                i2 = i;

            }

        }

    }

}

void HuffmanCode(element huffTree[])

{

    int i,j,k;

    int S[n],top = -1;

    for(i=0;i<n;i++)

    {

        printf(“字符%c的编码是:”,ch[i]);

        k = i;

        while(huffTree[k].parent != -1)

        {

            j = HuffmanTree[k].parent;

            if(huffTree[j].lchild == k)

                S[++top] = ‘0’;

            else

                S[++top] = ‘1’;

            k = j;

        }

        while(top > -1)

            printf(“%c”,S[top–]);

        printf(“\n”;)

    }

}

int main()

{

    element huffTree[2*n-1];

    HuffmanTree(huffTree);

    HuffmanCode(huffTree);

    return 0;

}

《哈夫曼树》

点赞