数据结构Huffman算法

数据结构Huffman算法的内容

#include<iostream>
#include<string.h>
using namespace std;
typedef char **Huffmancode;//动态分配数组存储哈夫曼编码表 
/*
首先要注意如何创建哈弗曼树 和哈夫曼树的构成
以权值为2 4 5 5 7构造为例子
选出最小的 2 4        2+4=6  删除 2 4 目前剩下 5 5 6 7 
再选出最小的  5 5     5+5=10 删除 5 5 目前剩下 6 7 10
选出 6 7 6+7=13 删除 6 7 剩下 10 13
10+13=23
构造结束
穿插下标的转换 
*/
//哈夫曼树的存储
typedef struct{
	int weight;//节点的权重 
	int parent,lchild,rchild;//节点的双亲 左、右孩子下标 
}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树 

//Select 重点 对应void CreateHuffmanTree(HuffmanTree &HT,int n) 里的Select 
void Select(HuffmanTree HT,int m,int *s1,int *s2)
{//从这m个数里边选择最小的2个
 int i;//从下标为1的位置开始计数  
 int min1=1000; 
 int min2=1000;//规定一个特别大的数 
 for(i=1;i<=m;i++)
 {
  	if(HT[i].parent==0&&min1>HT[i].weight)
  	{
  		 min1=HT[i].weight;
   		*s1=i;
  	}
}
 for(i=1;i<=m;i++)
 	{//注意这个I!=*s1标记min 
  		if(i!=(*s1)&&HT[i].parent==0)
   		if(HT[i].weight<min2)
   			{
    			min2=HT[i].weight;
    			*s2=i;
   			}
  	}	 
} 


//构造哈夫曼树
void CreateHuffmanTree(HuffmanTree &HT,int n)
{
	if(n<=1)
	{
		cout<<"输入的整数小于2 不符合"<<endl;
		return ; 
	}
	int m=2*n-1;//一棵n个节点的哈夫曼树有2n-1个节点 
	HT=new HTNode[m+1];//第0号单元没用  1~2n-1   这是为了方便实现代码 
	for(int i=1;i<=m;i++)
	{
		HT[i].parent=0;
		HT[i].rchild=0;
		HT[i].lchild=0;
	}
	cout<<"输入前n个单元中叶子节点的权值"<<endl; 
	for(int i=1;i<=n;i++)
	{
		cin>>HT[i].weight;//输入的是权值 
	}
/*初始化操作完成 开始创建哈夫曼树*/
	int s1,s2;
	for(int i=n+1;i<=m;i++)
	{//通过n-1次的选择 删除 合并来创建哈夫曼树 
		Select(HT,i-1,&s1,&s2);
 	//在HT[k](k 在 1~i-1)中选择两个其双亲域为0且权值最小的 
		HT[s1].parent=i; HT[s2].parent=i;
	//得到新结点i,从森林中删除s1,s2,将s1和s2的parent由0改为1	
		HT[i].lchild=s1; HT[i].rchild=s2;			//s1 s2作为i的左右孩子 
		HT[i].weight=HT[s1].weight+HT[s2].weight;	//i的权值作为左右孩子权值之和 
	} 	 
}

void CreatHuffmanCode(HuffmanTree HT,Huffmancode &HC,int n)
{//从叶子到根逆向求每个字符的哈夫曼编码 存储在HC表中 
	HC=new char*[n+1];  //存储空间 
	char *cd=new char[n];
	cd[n-1]='\0';
	int start,c,f;
	for(int i=1;i<=n;i++)//逐个字符求哈夫曼代码 
	{
		start=n-1;
		c=i; 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]=new char[n-start];
		strcpy(HC[i],&cd[start]);
	}
	delete cd;
} /哈夫曼编码实现完毕

int main(){
	HuffmanTree HT;
	Huffmancode HC;
	cout<<"请输入你要输入的信息数"<<endl;
	int n;
	cin>>n;
	char*str=new char[n+1];
	cout<<"输入字符"<<endl; 
	for(int i=1;i<=n;i++){
		cin>>str[i];//题目要求的是a b c等字母 
	}
	CreateHuffmanTree(HT,n);
	CreatHuffmanCode(HT,HC,n);
	cout<<"输入字符的权值"<<endl;
	for(int i=1;i<=n;i++)
	{
		cout<<str[i]<<"的Huffman编码为: "<<HC[i]<<endl;
	}
	return 0;
	
}

本文引用部分https://blog.csdn.net/qq_44218805/article/details/103401899的内容
运行结果在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值