实验五 哈夫曼树 (C++)

1、实验目的:

(1)理解哈夫曼树的概念、结构特性和哈夫曼编码原理;
(2)掌握构造哈夫曼树的基本方法;
(3)掌握运用哈夫曼树进行哈夫曼编码的方法。

2.、实验内容(实验题目与说明):

根据哈夫曼(Huffman)编码的原理,编写一个程序,在用户输入节点权重的基础 上建立它的哈夫曼编码。哈夫曼编码树是左分支代表 0,右分支代表 1,从根结点到每个叶子结点所经过的路径组成的 0 和 1 的序列便为该叶子结点对应字符的编码,称为哈夫曼编码。

3.代码

#include
#include
#include 
#define Max 20
#define MaxValue 1000
using namespace std;
typedef struct huffNode
{
    char ch;
    int weight;
    int lChild;
    int rChild;
    int parent;
    char hCode[Max];
}huffman;



void init(huffman *huffmanTree,int *w,char *z,int n)
{
    int i;
    //for(i=0;i<2*n-1;i++)
    //    huffmanTree[i]=(huffman *)malloc(sizeof(huffman));

    for(i=0;i<2*n-1;i++)
    {
        huffmanTree[i].ch=z[i];
        huffmanTree[i].weight=w[i];
        huffmanTree[i].parent=-1;
        huffmanTree[i].lChild=-1;
        huffmanTree[i].rChild=-1;
    }
}

void setHuffmanTree(huffman *huffmanTree,int n)
{
    int m,m1,m2,x1,x2,i,j;
    m=2*n-1;
    for(i=n;i<m;++i)
    {
        m1=m2=MaxValue;
        x1=x2=0;
        for(j=0;j<i;++j)
        {
            if(huffmanTree[j].parent==-1&&huffmanTree[j].weight<m1)
            {
                m2=m1;x2=x1;m1=huffmanTree[j].weight;x1=j;
            }
            else if (huffmanTree[j].parent==-1&&huffmanTree[j].weight<m2)
            {    m2=huffmanTree[j].weight;x2=j;
            }
        }
        huffmanTree[x1].parent=i;
        huffmanTree[x2].parent=i;
        huffmanTree[i].lChild=x1;
        huffmanTree[i].rChild=x2;
        huffmanTree[i].weight=m1+m2;
    }
}


void huffmanTreeCode(huffman *huffmanTree,int n)
{
    char hc[Max];
    int hcLen;
    int i,j,k,parent,p;
    for(i=0;i<n;i++)
    {
        hcLen=0;
        parent=huffmanTree[i].parent;//待编码字符的双亲结点下标
        p=i;
        while(parent!=-1)//未到达根结点
        {
            if(huffmanTree[parent].lChild==p)//是左孩子
                hc[hcLen]='0',hcLen++;
            else if(huffmanTree[parent].rChild==p)//是右孩子
                hc[hcLen]='1',hcLen++;
                p=parent;
                parent=huffmanTree[parent].parent;//继续向根结点查找
    }
    for(j=0,k=hcLen-1;j<hcLen;j++,k--)//将编码写入相应字符数组
        huffmanTree[i].hCode[j]=hc[k];
        huffmanTree[i].hCode[j]='\0';//加上字符串结束符
    }

    return;
}



int main()
{
    int n,i;

    char z,*Z;
    int w,W[Max];
    huffman huffmanTree[Max];
    
    printf("请输入叶子个数:\n");
    scanf("%d",&n);
   //W=(int *)malloc(n*sizeof(int));
    Z=(char *)malloc(n*sizeof(char));
    printf("请输入%d个字符和权值。\n",n);
    for(i=0;i<n;i++)
    {
        printf("请输入第%d个字符:\n",i+1);
        //scanf("%c",&z);
        cin>>z;
        Z[i]=z;
        printf("请输入第%d个字符的权:\n",i+1);
        //scanf("%d",&w);
        cin>>w;
        W[i]=w;
    }
    
    init(huffmanTree,W,Z,n);
    setHuffmanTree(huffmanTree,n);
    huffmanTreeCode(huffmanTree,n);
    for(i=0;i<n;i++)
    {
        printf("%c:%s\n",huffmanTree[i].ch,huffmanTree[i].hCode);

    }
    return 0;
}

4.运行与测试

实验五 哈夫曼树 (C++)_第1张图片
我用了实验给出的2453四个叶子的数据进行检测,实验结果与预料相同。
建立的哈夫曼树应该为2345。

你可能感兴趣的:(C++,实验,数据结构,数据结构,c++,算法)