数据结构:哈夫曼树(HuffmanTree)

本文介绍了哈夫曼树的概念,它是数据结构中一种用于实现最优二叉树的结构,特别适用于数据压缩。通过读取权值构建哈夫曼树,并展示了如何进行编码和解码的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        哈夫曼树:给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

 

 

 

定义结构体:

typedef struct wordcnt{
	//统计字符和对应的次数 
	char ch;
	int cnt = 0;
}; 

typedef struct NumCount{
	//统计次数的外部封装 
	Count count[MaxSize];
	int length = 0;
};

typedef struct HTree{
	//哈夫曼树结构 
	char data;
	int weight;
	int parent,lchild,rchild;
};

typedef struct HCode{
	//编码结构 、树节点的编码 
	char data;
	char*str;
};

函数解释:

Status ReadData(char *source);//读入文件 
Status WordCount(char *data,NumCount *paraCnt);//统计次数 
Status Show(NumCount *paraCnt);//展示次数 
Status CreateHuffmanTree(HuffmanTree &HT,int length,NumCount cntarray);//创建哈夫曼树 
Status select(HuffmanTree HT,int top,int *s1,int *s2);//选择权重最小的两个节点 
Status CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int length);//创建哈夫曼编码 
Status Encode(char *data,HuffmanCode HC, int length);//将读入的文件编码,写到txt文件 
Status Decode(HuffmanTree HT,int length);//读入编码文件,解码

主要的运行部分:

int main(int argc, char** argv){
	char data[MaxSize];
	NumCount Cntarray;
	ReadData(data);//读取数据
	WordCount(data,&Cntarray);//统计次数
//  Show(&Cntarray);//可以查看每个单词出现的对应次数
	HUffmanTree tree;
	CreateHuffmanTree(tree,Cntarray.length,Cntarray);//建树
	HuffmanCode code;
	CreateHuffmanCode(tree,code,Cntarray.length);//创建编码
	Encode(data,code,Cntarray.length); //生成编码文件
	Decode(tree,Cntarray.length);//解码
	cout<<"please view the generated TXT file to check the result(请检查这个改变的TXT文件中的编码一边检查结果)"<<end1;
	return 0; 
}

读取数据:

void ReadData(char *source)
{
	//打开文件读入数据 
	ifstream infile;
	infile.open("in.txt");
	cout<<"Reading..."<<endl;
	cout<<"the input file 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值