赫夫曼树的构建

给定报文中26个字母a-z及空格的出现频率{64, 13, 22, 32, 103, 21, 15, 47, 57, 1, 5, 32, 20, 57, 63, 15, 1, 48,51, 80, 23, 8, 18, 1, 16, 1, 168},构建赫夫曼树并为这27个字符编制赫夫曼编码,并输出。模拟发送端,从键盘输入字符串,以%为结束标记,在屏幕上输出输入串的编码;模拟接收端,从键盘上输入0-1赫夫曼编码串,翻译出对应的原文。


l  模拟发送端 

输入:I love you    

输出:01101111011110011100000010111100011100100001

l  模拟接收端输入

输入:01101101111011000111111010111101101001100001

输出:it is a dog



#include <iostream>
#include <algorithm>
#include <queue>
#include <stdlib.h>
using namespace std;
const int N=100;
typedef struct tree{
	char data;
	int  weight;
	struct tree *lchild,*rchild;
}tree;	tree *tre[28];
bool cmp(tree a,tree b){
	return a.weight>b.weight;
}
int weight[27],path[N],code[28][28]; 
int a1(){
	for(int i=0;i<27;i++)
		cin>>weight[i];
	return 0;
}
int a2(){
	tree *p;
	for(int i=0;i<27;i++)
	{
		tre[i]=(tree*)malloc(sizeof(tree));
		tre[i]->data='a'+i;
		tre[i]->weight=weight[i];
		tre[i]->lchild=tre[i]->rchild=NULL;	
	}
	
	
	p=(tree*)malloc(sizeof(tree));
	for(int i=0;i<27;i++)
	for(int j=i+1;j<27;j++)
	{
		if(tre[i]->weight<tre[j]->weight)
		{
			p=tre[i];
			tre[i]=tre[j];
			tre[j]=p;
		}
	}
	
	int text=27; 
	while(--text>0) 
	{
		p=(tree*)malloc(sizeof(tree));
		p->lchild=tre[text];
		p->rchild=tre[text-1];
		p->weight=tre[text]->weight+tre[text-1]->weight;
		for(int i=text-2;i>=0;i--)
		{
			if(tre[i]->weight > p->weight)		
			{
				tre[i+1]=p;
				break;
			}
			tre[i+1]=tre[i];
			if( i==0 )
			{
				tre[i]=p;
			}
		}
	}
	tre[0]=p;
	return 0;
}
int a3(tree *t,int i,int j){
	path[j]=i;
	int k;
	if(t->lchild) 	a3(t->lchild,0,j+1);
	if(t->rchild)	a3(t->rchild,1,j+1);
	if(          (!t->lchild&&!t->rchild))
	{
		for( k=0;k<=j;k++)
			code[t->data-'a'][k]=path[k];
		code[t->data-'a'][27]=k;
	}
}	
int a4(){
	for(int i=0;i<27;i++)
	{
		if(i!=26)
		{
			cout<<"["<<char('a'+i)<<"]: ";
			for(int j=1;j<code[i][27];j++)
				cout<<code[i][j];
			cout<<endl;
		}
		else  
		{
			cout<<"[ ]: ";
			for(int j=1;j<code[i][27];j++)
				cout<<code[i][j];
			cout<<endl;
		}
	}
}
int a5(){
	queue<int>q;
	int m=1;
	char c;
	scanf("%c",&c);
	while(m)
	{
		scanf("%c",&c);
		switch(c)
		{
			case '\n': m=0;break;
			case ' ':  q.push(26);break;
			default :  q.push(c-'a');break;
		}
	}
	while(!q.empty())
	{
		int i=q.front();
		q.pop();
		for(int j=1;j<code[i][27];j++)
				cout<<code[i][j];
	}
	cout<<endl;
}
int a6(tree *l){
	tree *t;t=l;
	queue<int>q;
	int m=1;
	char c;scanf("%c",&c);
	while(m)
	{
		scanf("%c",&c);
		switch(c)
		{
			case '\n': m=0;break;
			default :  q.push(c-'0');break;
		}
	}
	while(!q.empty())
	{
		int i=q.front();
		q.pop();
		if(i==0)
		{
			t=t->lchild;
			if((!t->lchild&&!t->rchild))
			{
				if(t->data=='{') cout<<" ";
				else cout<<t->data;
				t=l;
			}
		}
		else
		{
			t=t->rchild;
			if((!t->lchild&&!t->rchild))
			{
				if(t->data=='{') cout<<" ";
				else cout<<t->data;
				t=l;
			}
		}
	}
	cout<<endl;
}
int main() 
{
	printf("请选择下列菜单:\n");
	printf("***********************************\n");
	printf("******** 1.输入HuffmanTreer的参数  ********\n");
	printf("******** 2.初始化HuffmanTreer的参数********\n");
	printf("******** 3.创建HuffmanTreer和编码表********\n"); 
	printf("******** 4.输出编码表 			   ********\n"); 
	printf("******** 5.输入编码,并翻译为字符  ********\n"); 
	printf("******** 6.输入字符,并实现转码    ********\n"); 
	printf("******** 7.退出            		   ********\n");
	printf("***********************************\n");
	printf("请输入你的选择:\n");	
	while(1)
	{
		int n;
		cin>>n;
		switch(n)
		{
			case 1: a1();break;
			case 2: a2();break;
			case 3: a3(tre[0],0,0);break;
			case 4: a4();break;
			case 5: a5();break;
			case 6: a6(tre[0]);break;
			case 7: exit (0);
		}
	}
	return 0;
}


  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值