6-112 哈夫曼编码

编写函数实现哈夫曼编码。输入结点个数(保证个数>1)及各结点的权值,为各结点进行编码。

函数接口定义:

CreateHuffman_tree(HuffmanTree &HT,int n);/*建立n个叶子结点的哈夫曼树*/
Huffman_code(HuffmanTree HT,HuffmanCode &HC,int n);//求哈夫曼编码

其中 HT 为哈夫曼树,n 为叶子结点个数, HC 为哈夫曼编码。

裁判测试程序样例:

#include
#include
#include
typedef struct hnode
{ int weight;
   int lchild,rchild,parent;
 }HTNode,*HuffmanTree;/*定义二叉树的存储结点*/
typedef char **HuffmanCode;
void Select(HTNode HT[],int len,int &s1,int &s2)//选出权值最小的两个结点,下标通过s1和s2传出去
{
    int i,min1=32767,min2=32767;
    for(i=1;i<=len;i++)
    {
        if(HT[i].weight         {
            s2=s1;
            min2=min1;
            min1=HT[i].weight;
            s1=i;
        }
        else if(HT[i].weight         {    min2=HT[i].weight;
            s2=i;
        }
    }
}
void CreateHuffman_tree(HuffmanTree &Ht,int n);/*建立哈夫曼树*/
void Huffman_code(HuffmanTree HT,HuffmanCode &HC,int n);/*哈夫曼树编码*/

int main()
{
    HuffmanTree HT;
    HuffmanCode HC;
    int i, n;
    scanf("%d",&n);
    CreateHuffman_tree(HT, n);/*建立哈夫曼树*/
    Huffman_code(HT,HC,n);/*哈夫曼树编码*/
    for(i=1;i<=n;i++)/*输出字符、权值及编码*/
       printf("编码是:%s\n",HC[i]);
    return 0;
}


/* 请在这里填写答案 */

输入样例:

3
1 2 3

输出样例:

编码是:10
编码是:11
编码是:0

 

 void CreateHuffman_tree(HuffmanTree &HT, int n) {
    if (n <= 1) return;

    int m = 2 * n - 1;
    HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));

    for (int i = 1; i <= m; i++) {
        HT[i].weight = 0;
        HT[i].parent = 0;
        HT[i].lchild = 0;
        HT[i].rchild = 0;
    }

    for (int i = 1; i <= n; i++) {
        scanf("%d", &HT[i].weight);
    }

    for (int i = n + 1; i <= m; i++) {
        int s1, s2;
        Select(HT, i - 1, s1, s2);
        HT[s1].parent = i;
        HT[s2].parent = i;
        HT[i].lchild = s1;
        HT[i].rchild = s2;
        HT[i].weight = HT[s1].weight + HT[s2].weight;
    }
}

void Huffman_code(HuffmanTree HT, HuffmanCode &HC, int n) {
    HC = (HuffmanCode)malloc((n + 1) * sizeof(char *));
    char *cd = (char *)malloc(n * sizeof(char));
    cd[n - 1] = '\0';

    for (int i = 1; i <= n; i++) {
        int start = n - 1;
        int c = i;
        int f = HT[i].parent;

        while (f != 0) {
            --start;
            if (HT[f].lchild == c) {
                cd[start] = '0';
            } else {
                cd[start] = '1';
            }
            c = f;
            f = HT[f].parent;
        }

        HC[i] = (char *)malloc((n - start) * sizeof(char));
        strcpy(HC[i], &cd[start]);
    }

    free(cd);
}

你可能感兴趣的:(算法)