哈夫曼编码

#include"iostream"
#include"fstream"
using namespace std;


typedef struct  node
{
 char x;
 int rchild ;
 int lchild;
 int weight;
 int parent;
   

}Node;

void bianma(Node *tree,int n);
void yima(Node *tree,int n,int *a);

int  main()
{
 int i,n;
 fstream fl1,fl2;
 fl1.open("input.txt",ios::in);
 
 fl1>>n;

 Node *treenode= new node[2*n];
 int *a=new int [n+1];
    for(i=1;i<2*n;i++)
 {
        treenode[i].lchild=0;
  treenode[i].rchild=0;
  treenode[i].weight=0;
  treenode[i].parent=0;
 }
 for(i=1;i<=n;i++)
 {
       fl1>>treenode[i].x>>treenode[i].weight;
 }
 
 bianma(treenode,n);
 
 yima(treenode,n,a);
 
 fl2.open ("output.txt",ios::out);
 for(i=1;i<=n;i++)
 {
     fl2<<treenode[i].x<<" "<<a[i];
 }

return 0;
 
}


void bianma(Node *tree,int n)
{
 int i,j,tem[3],k[3],key=n;
 while(key<2*n-1)
 {
 for(j=1;j<=2;j++)
 {
   for(i=1;i<=key;i++)
    if(tree[i].parent==0)
    {
            tem[j ]=tree[i].weight;
         k[j ]=i;
   break;
    }
  
 

   for(i=1;i<=key;i++)
  
     if(tree[i].parent==0 && tem[j]>tree[i].weight)
   {
           tem[j]=tree[i].weight;k[j]=i;
    

   }
  

    tree[k[j]].parent=key+1;
 
 }
    key++;
    tree[key].rchild=k[1];
    tree[key].lchild=k[2];
    tree[key].weight=tree[k[1]].weight+tree[k[2]].weight;
   
 }
}

void yima(Node *tree,int n,int *a)
{
 int i,j,k;
for(i=1;i<=n;i++)
{
 j=0;k=i;
 while(tree[k].parent!=0)
 {
  j++;
  k=tree[k].parent;
 
 }
 
 a[i]=j;
 
}

}


//老师的
#include<iostream>
#include<string.h>
using namespace std;
typedef struct TreeNode
{
 char c;
 int w;
 int parent;
 int right;
 int left;
 int tag;
 char * code;
}Node;
void Find(Node * tree, int n, int & m1, int & m2)
{
 m1 = -1;
 while(tree[++ m1].tag != 0);
 m2 = m1;
 while(tree[++ m2].tag != 0);
 for(int i = m2 + 1; i < n; i ++)
 {
  if(tree[i].tag == 0)
  {
   if(tree[i].w < tree[m1].w || tree[i].w < tree[m2].w)
   {
    if(tree[m2].w < tree[m1].w)
     m1 = m2;
    m2 = i;   
   }
  }
 }
}
void Huffman(Node * tree, int n)

 int min1, min2;
 for(int i = 0; i < n - 1; i ++)
 {
  Find(tree, n + i, min1, min2);
  tree[n + i].w = tree[min1].w + tree[min2].w;
  tree[n + i].left = min1;
  tree[n + i].right = min2;
  tree[n + i].tag = 0;
  tree[n + i].parent = 0;
  tree[min1].parent = n + i;
  tree[min2].parent = n + i;
  tree[min1].tag = 1;
  tree[min2].tag = 1;
 }
}
void HuffmanCoding(Node * tree, int n)
{
 char * code = new char[n];
 char * t = code + n - 1;             
 for(int i = 0; i < n; i ++)
 {
  int k = i;
  code = t;
  *code= '/0';  
  while(tree[k].parent != 0)
  {
   int p = tree[k].parent;
   if(tree[p].left == k)
    *(-- code) = '0';
   else
    *(-- code) = '1';
   k = p;
  }
  tree[i].code = new char[strlen(code) + 1];
 
  strcpy(tree[i].code, code);
  cout<<tree[i].c<<"  "<<tree[i].code<<endl;  
 }
    //译码
 {
  cout<<"input string:"<<endl;
     char c;
     bool find = false;
  while((c = getchar()) != '/n')
  {
   for(int i = 0; i < n; i ++)
   {
    if(tree[i].c == c)
    {
     cout<<tree[i].code;
     find = true;
     break;
    }
   }
   if(find)
   {
    find = false;
   }
   else
   {
    cout<<"*";
    break;
   }
  }
  cout<<endl;   
 }
}
void HffmanDecoding(Node * tree, int n)
{
 
 cout<<"input code:"<<endl;
 char c;
 int i = 2 * n - 2;
 while((c = getchar()) != '/n')
 {
         if(c == '0')
   {
    i = tree[i].left;    
   }
   else if(c == '1')
   {
    i = tree[i].right;
   }
   else
   {
    cout<<"*"<<endl;
    break;
   }
  
   if(i < n)
   {
    cout<<tree[i].c;
    i = 2 * n - 2;
   }
 }
}
int main()
{
 int n;
 cin>>n;
 Node * tree = new Node[2 * n - 1];
 for(int i = 0; i < n; i ++)
 {
  cin>>tree[i].c>>tree[i].w;
  tree[i].tag = 0;
 }
 freopen("CON", "r", stdin);
 Huffman(tree, n);
 HuffmanCoding(tree, n);
 HffmanDecoding(tree, n);
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值