哈夫曼树C++实现

哈夫曼树(C++实现) 哈夫曼树的概念:在含有 n 个带权叶节点的二叉树中,其中带权路径长度(WPL)最小的二叉树,也叫做最优二叉树。 阅读详情

哈夫曼树

给定一组具有确定权值的叶子结点,可以造出不同的二叉树,将其中带权路径长度最小的二叉树称为哈夫曼树(Huffman tree)。

哈夫曼节点类

哈夫曼节点会存储节点的权重以及,ch是节点对应的编码字符的下标,这里需要重载“<”,因为我们要使用最小优先级队列。

//哈夫曼树节点类
class hfTNode {
public:
	int weight;//节点的权重
	int ch;//存储节点的下标
	hfTNode* leftchild, * rightchild;//创建该结点的左右孩子指针
	hfTNode() ://哈夫曼树节点类初始化
		leftchild(nullptr), rightchild(nullptr) {}
	hfTNode(int data) ://哈夫曼树节点类初始化
		leftchild(nullptr), rightchild(nullptr), weight(data) {}
	//拷贝构造函数
	hfTNode(const hfTNode& N) {
		ch = N.ch;
		weight = N.weight;
		if (N.leftchild) {
			leftchild = new hfTNode();
			*leftchild = *(N.leftchild);
		}
		else
			leftchild = nullptr;
		if (N.rightchild) {
			rightchild = new hfTNode();
			*rightchild = *(N.rightchild);
		}
		else
			rightchild = nullptr;
	}
	// 重载"<"符号,令其为最小值优先
	bool operator < (const hfTNode& N) const{
		return weight > N.weight;
	}
};

哈夫曼树类

哈夫曼树类实现了树的构建,编码表的实现,压缩和解压缩文本功能

//哈夫曼树类
class Huffman
{
public:
	Huffman(const string &sample);// 构造函数
	~Huffman();// 析构函数

	bool IsLeaf(hfTNode* Root);//判断节点是否为叶子结点
	void GetFreq(vector<int> &des);//获取当前的权重数组
	void BuildTree();//构建一颗哈夫曼树
	void BuildCode();//根据哈夫曼树构建编码表
	void GetCodeList();//遍历编码表和编码表对应的编码

	//前序遍历和中序遍历是为了确定哈夫曼树的形状是否正确
	void PreOrder();
	void InOrder();

	string Expend(const string &des);//解压缩
	string Compress(const string &des);//压缩
	

private:
	void _del(hfTNode* root);//删除哈夫曼树
	void _build(hfTNode* root, string str);//生成map的key与value值
	void _PreOrder(hfTNode* root);
	void _InOrder(hfTNode* root);
	unordered_map<char, string> map;//key为编码表的字符,value为编码表的字符对应的编码形式例如“101”,“111”
	vector<int> freq; // 权重数组
	vector<char> st; // 编码表
	
	hfTNode* Root; // 哈夫曼树根节点
};

哈夫曼树的实现

简单来说,就是将节点压入最小优先级队列中(这里也可以使用最小堆完成,不过我上一节编写的最小堆没有写成模板类,所以就懒一点,直接用STL里面的优先级队列了),然后每次取出最小的两个节点,将这两个节点作为左孩子节点和右孩子节点,将这两个节点的权重再合并成一个节点,那么这个新的节点就是该子树的根结点,再将这个紫薯的根结点压入最小优先级队列中,重复这个过程,直至生成一棵树。

//构建一颗哈夫曼树
void Huffman::BuildTree()
{
	priority_queue<hfTNode> myqueue;//使用最小优先级队列存储节点
	for (int i = 0; i < freq.size(); i++){//节点初始化,并将节点压入最小优先级队列中
		hfTNode* temp = new hfTNode(freq[i]);
		temp->ch = i;
		myqueue.push(*temp);
	}
	//合并节点并生成树
	while (myqueue.size() > 1) {
		//从队列中取出两个最小元素作为新子树的左孩子和右孩子
		hfTNode left = myqueue.top();
		myqueue.pop();
		hfTNode right = myqueue.top();
		myqueue.pop();
		//创建新子树的根节点,并将其压入队列中
		hfTNode* parent = new hfTNode(left.weight + right.weight);
		parent->ch = -1;//设定子树生成的根结点下标值是-1,只做区分用
		parent->leftchild = &left;
		parent->rightchild = &right;
		myqueue.push(*parent);
	}
	//生成哈夫曼树的根结点
	Root = new hfTNode();
	*Root = myqueue.top();
	myqueue.pop();
}

依据哈夫曼树生成存储编码表的map

没啥好说的,就是递归,map的key是文本符号如‘A’,‘B’,value是文本需要压缩成的二进制字符串,如‘11’,‘110’

//根据哈夫曼树构建编码表
void Huffman::BuildCode()
{
	if (Root == nullptr) return;
	//string temp('\0');
	string temp;
	temp.clear();//初始化为空字符串
	_build(Root, temp);
}

void Huffman::_build(hfTNode* root, string str)
{
	if (IsLeaf(root) && root->ch >= 0) {
		cout << str << "    ";
		map[st[root->ch]] = str;
		return;
	}
	if(root->leftchild) _build(root->leftchild, str + '0');
	if(root->rightchild) _build(root->rightchild, str + '1');
}

压缩

//压缩
string Huffman::Compress(const string& des)
{
	string res;
	for (int i = 0; i < des.length(); ++i) {
		if (des[i] == '\n'||des[i]==' ')
			continue;
		res += map[des[i]];
	}	
	return res;
}

解压缩

//解压缩
string Huffman::Expend(const string& des)
{
	string res;
	int i(0), n(des.size());
	hfTNode* temp = new hfTNode();
	temp = Root;
	while (i < n) {	
		if (des[i]=='0')
		{
			temp = temp->leftchild;
			i++;
			if (IsLeaf(temp)) {
				res += st[temp->ch];
				temp = Root;
				continue;
			}
		}
		if (des[i] == '1')
		{
			temp = temp->rightchild;
			i++;
			if (IsLeaf(temp)) {
				res += st[temp->ch];
				temp = Root;
				continue;
			}
		}
	}
	return res;
}

全部代码

huffmanTree.h

#pragma once
#ifndef HUFFMANTREE_H
#define HUFFMANTREE_H
#include<iostream>
#include<vector>
#include<unordered_map>
#include<queue>
using namespace std;

//哈夫曼树节点类
class hfTNode {
public:
	int weight;//节点的权重
	int ch;//存储节点的下标
	hfTNode* leftchild, * rightchild;//创建该结点的左右孩子指针
	hfTNode() ://哈夫曼树节点类初始化
		leftchild(nullptr), rightchild(nullptr) {}
	hfTNode(int data) ://哈夫曼树节点类初始化
		leftchild(nullptr), rightchild(nullptr), weight(data) {}
	//拷贝构造函数
	hfTNode(const hfTNode& N) {
		ch = N.ch;
		weight = N.weight;
		if (N.leftchild) {
			leftchild = new hfTNode();
			*leftchild = *(N.leftchild);
		}
		else
			leftchild = nullptr;
		if (N.rightchild) {
			rightchild = new hfTNode();
			*rightchild = *(N.rightchild);
		}
		else
			rightchild = nullptr;
	}
	// 重载"<"符号,令其为最小值优先
	bool operator < (const hfTNode& N) const{
		return weight > N.weight;
	}
};

//哈夫曼树类
class Huffman
{
public:
	Huffman(const string &sample);// 构造函数
	~Huffman();// 析构函数

	bool IsLeaf(hfTNode* Root);//判断节点是否为叶子结点
	void GetFreq(vector<int> &des);//获取当前的权重数组
	void BuildTree();//构建一颗哈夫曼树
	void BuildCode();//根据哈夫曼树构建编码表
	void GetCodeList();//遍历编码表和编码表对应的编码

	//前序遍历和中序遍历是为了确定哈夫曼树的形状是否正确
	void PreOrder();
	void InOrder();

	string Expend(const string &des);//解压缩
	string Compress(const string &des);//压缩
	

private:
	void _del(hfTNode* root);//删除哈夫曼树
	void _build(hfTNode* root, string str);//生成map的key与value值
	void _PreOrder(hfTNode* root);
	void _InOrder(hfTNode* root);
	unordered_map<char, string> map;//key为编码表的字符,value为编码表的字符对应的编码形式例如“101”,“111”
	vector<int> freq; // 权重数组
	vector<char> st; // 编码表
	
	hfTNode* Root; // 哈夫曼树根节点
};




#endif // !HUFFMANTREE_H
#include "huffmanTree.h"

//依据字符串生成编码表以及权重数组
Huffman::Huffman(const string &sample)
{
	int len = sample.length();
	if (len == 0) { cout << "请重新输入字符串" << endl; exit(-1); }
	unordered_map<char, int> mymap;
	for (int i = 0; i < len; ++i) {//依据输入字符串初始化哈希表
		if (mymap.find(sample[i]) == mymap.end())
			mymap[sample[i]] = 1;
		else
			mymap[sample[i]] += 1;
	}
	for (const auto& pair : mymap) {//遍历哈希表,并将key与value分别压入编码表与频率数组中
		//unordered_map<char, int>::const_iterator pair
		st.push_back(pair.first);
		freq.push_back(pair.second);
	}
}

//析构函数
Huffman::~Huffman()
{
	_del(Root);
}
//判断节点是否为叶子结点
bool Huffman::IsLeaf(hfTNode* Root)
{
	if(Root==nullptr) return false;
	if (Root->leftchild == nullptr && Root->rightchild == nullptr) 
		return true;
	else 
		return false;
}

//获取当前的权重数组
void Huffman::GetFreq(vector<int> &des)
{
	for (int i = 0; i < freq.size(); i++)
		des.push_back(freq[i]);
}

//构建一颗哈夫曼树
void Huffman::BuildTree()
{
	priority_queue<hfTNode> myqueue;//使用最小优先级队列存储节点
	for (int i = 0; i < freq.size(); i++){//节点初始化,并将节点压入最小优先级队列中
		hfTNode* temp = new hfTNode(freq[i]);
		temp->ch = i;
		myqueue.push(*temp);
	}
	//合并节点并生成树
	while (myqueue.size() > 1) {
		//从队列中取出两个最小元素作为新子树的左孩子和右孩子
		hfTNode left = myqueue.top();
		myqueue.pop();
		hfTNode right = myqueue.top();
		myqueue.pop();
		//创建新子树的根节点,并将其压入队列中
		hfTNode* parent = new hfTNode(left.weight + right.weight);
		parent->ch = -1;//设定子树生成的根结点下标值是-1,只做区分用
		parent->leftchild = &left;
		parent->rightchild = &right;
		myqueue.push(*parent);
	}
	//生成哈夫曼树的根结点
	Root = new hfTNode();
	*Root = myqueue.top();
	myqueue.pop();
}

//根据哈夫曼树构建编码表
void Huffman::BuildCode()
{
	if (Root == nullptr) return;
	//string temp('\0');
	string temp;
	temp.clear();//初始化为空字符串
	_build(Root, temp);
}

//遍历编码表和编码表对应的编码
void Huffman::GetCodeList()
{
	for (const auto& pair : map) 
		cout << pair.first << ": " << pair.second << endl;
}

void Huffman::PreOrder()
{
	if (Root == nullptr) return;
	_PreOrder(Root);
}

void Huffman::InOrder()
{
	if (Root == nullptr) return;
	_InOrder(Root);
}

//解压缩
string Huffman::Expend(const string& des)
{
	string res;
	int i(0), n(des.size());
	hfTNode* temp = new hfTNode();
	temp = Root;
	while (i < n) {	
		if (des[i]=='0')
		{
			temp = temp->leftchild;
			i++;
			if (IsLeaf(temp)) {
				res += st[temp->ch];
				temp = Root;
				continue;
			}
		}
		if (des[i] == '1')
		{
			temp = temp->rightchild;
			i++;
			if (IsLeaf(temp)) {
				res += st[temp->ch];
				temp = Root;
				continue;
			}
		}
	}
	return res;
}

//压缩
string Huffman::Compress(const string& des)
{
	string res;
	for (int i = 0; i < des.length(); ++i) {
		if (des[i] == '\n'||des[i]==' ')
			continue;
		res += map[des[i]];
	}	
	return res;
}

void Huffman::_PreOrder(hfTNode* root)
{
	if (root == nullptr) return;
	cout << root->ch << " :" << root->weight << endl;
	_PreOrder(root->leftchild);
	_PreOrder(root->rightchild);
}


void Huffman::_InOrder(hfTNode* root)
{
	if (root == nullptr) return;
	_InOrder(root->leftchild);
	cout << root->ch << " :" << root->weight << endl;
	_InOrder(root->rightchild);
}

//删除哈夫曼树
void Huffman::_del(hfTNode* root)
{
	if (root == nullptr) 
		return;
	if (root->leftchild) 
		_del(root->leftchild);
	if (root->rightchild) 
		_del(root->rightchild);
}

void Huffman::_build(hfTNode* root, string str)
{
	if (IsLeaf(root) && root->ch >= 0) {
		cout << str << "    ";
		map[st[root->ch]] = str;
		return;
	}
	if(root->leftchild) _build(root->leftchild, str + '0');
	if(root->rightchild) _build(root->rightchild, str + '1');
}

测试代码:

// main.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include"huffmanTree.h"

int main() {
	string sample = "AAAAACCCCCCBBBBDDDFFE";
	Huffman hf(sample);
	vector<int> des;
	hf.GetFreq(des);
	for (int i = 0; i < des.size(); ++i) {
		cout << des[i] << " ";
	}
	hf.BuildTree();
	cout << endl;
	hf.PreOrder();
	cout << endl << endl;
	hf.InOrder();
	hf.BuildCode();
	cout << endl << endl;
	hf.GetCodeList();

	cout << endl << endl;
	string res=hf.Compress(sample);
	cout << hf.Expend(res);
	return 1;
}

测试结果

C++实现构造哈夫曼、哈夫曼编码 例:设n=7,w={0.4,0.3,0.15,0.05,0.04,0.03,0.03}构造哈夫曼树,并求哈夫曼编码。 阅读详情

相关推荐

【C++】哈夫曼树模拟实现

文章目录一. 什么是哈夫曼树1. 基本术语介绍2. 哈夫曼树的概念3. 哈夫曼树的特点二. 为什么要有哈夫曼树1. 表示哈夫曼编码2. 哈夫曼编码的特点三. 哈夫曼树的构造、编码、译码实现1. 场景说明2. 哈夫曼树基本框架3. 哈夫曼树的成员处理**第一步:初始化哈夫曼树**第二步:构造哈夫曼树Select 一. 什么是哈夫曼树 1. 基本术语介绍 在解释什么是哈夫曼树之前,先介绍三个基本术语:节点的路径长度、节点的权重和树的带权路径长度。 节点的路径长度 当前节点到根节点路径中边的个数称为该节点的路

m0_51064412的博客 1483

哈夫曼树(Huffman-Tree)的C++实现

哈夫曼树(Huffman-Tree)的C++实现

weixin_51049319的博客 638

哈夫曼树的构造C/C++代码实现

哈夫曼树: 所谓哈夫曼(Huffman)树就是最优二叉树,是带权路径长度WPL最小的二叉树。 哈夫曼树的构造: 根据哈夫曼树的特点:权值越大的结点离根结点越近。 具体方法:依次选择权值最小的二个结点作为左右子树构造一颗新的二叉树,其产生的根结点的权值为左右子树权值之和。一直重复直到只含一棵树为止。‘ 权值: 哈夫曼树: 哈夫曼树的存储: 由于哈夫曼树中没有度为1 的结点,则一棵有n个叶子结点的哈夫曼树共有 2n-1个结点,可以存储在一个大小为2n-1的一维数组中。 为了实现方便,数组的0号单元不使用,从

Ycy的博客 1万+

【数据结构C/C++】C语言哈夫曼编码与解码实现细则(附代码以及详细实现解释)

哈夫曼树作为最常见的考研树题目,拥有强大的压缩功能。 这篇文章将带你了解哈夫曼树如何实现编码与解码

Zhangsama1的博客 2万+

哈夫曼树的c++实现

huffman 树称为最优二叉树,用其来对字符编码是一种比较好的选择,huffman树的实现也比较简单,构造huffman树的思想就是每次从序列中取出权值最小的两个,然后构造出一个树,然再去构造,一直到只有一个根节点为止。根据这个“每次从中选出最小的两个值”,我们应该想到优先队列,优先队列可以迅速的从一堆数中找出极小值或者极大值,用优先队列的这个性质可以很简单的构造huffman树。     当

hujian_的专栏 2799

检索增强世界模型(R-WoM)原理与应用实践

世界模型是AI系统理解环境的核心技术,通过构建环境的内部表示实现状态预测和行动规划。传统方法基于RNN或VAE等神经网络,而检索增强世界模型(R-WoM)创新性地引入检索机制,结合外部记忆库提升系统性能。这种架构突破模型参数限制,使AI能像人类一样利用历史经验解决问题,在游戏AI、虚拟助手等场景表现优异。关键技术包括FAISS相似性搜索、分层记忆管理和动态检索策略,其中Transformer编码器和GRU动态模型的组合实现高效环境建模。实践表明,该方法可提升47%的战术多样性,加快32%的应急响应速度。

weixin_42676876的博客 341

C++哈夫曼树+哈夫曼编码的实现(双完整版)

C++版全网最全、详解、引导思考的哈夫曼树和哈夫曼编码讲解,剖析了关键代码,适合收藏~

不负AC不负卿的博客 2万+

深度学习-算法工程师岗位面试常见问题及解答

一、相关的问题 深度学习优化学习方法(一阶、二阶) 一阶方法:随机梯度下降(SGD)、动量(Momentum)、牛顿动量法(Nesterov动量)、AdaGrad(自适应梯度)、RMSProp(均方差传播)、Adam、Nadam。 二阶方法:牛顿法、拟牛顿法、共轭梯度法(CG)、BFGS、L-BFGS。 自适应优化算法有哪些?(Adagrad(累积梯度平方)、RMSProp(累积梯度平方的滑动平均)、Adam(带动量的RMSProp,即同时使用梯度的一、二阶矩))。 梯度下降陷入局部最优有什么解决

nobles007820的博客 2924

哈夫曼树与哈夫曼编码详解及C++模板实现

哈夫曼树又称最优二叉树,是带权路径长度最短的树,可用来构造最优编码,用于信息传输、数据压缩等方面,是一种应用广泛的二叉树。 几个相关的基本概念:1.路径:从树中一个结点到另一个结点之间的分支序列构成两个节点间的路径 2.路径长度:路径上的分支的条数称为路径长度 3.树的路径长度:从树根到每个结点的路径长度之和称为树的路径长度 4.结点的权:给树中结点赋予一个数值,该数值称为结点的权 5.带

Tanswer_ 1万+

告别Qt Creator?手把手教你用VSCode+MinGW调试QT项目(附完整launch.json配置)

本文详细介绍了如何在VSCode中配置完整的QT开发环境,特别是针对使用MinGW编译器的用户。从环境搭建到调试配置,包括生成.pro文件、Makefile,以及配置task.json和launch.json文件,帮助开发者高效调试QT项目。

weixin_27180827的博客 185

车载面试题目(ADAS)

多数功能都是依靠的前置传感器(经过Lidar、Radar、Camera融合),比如ACC、AEB、LKA、NOA、TJA、FCW等,只有少数涉及周视传感器,比如BSD、CVW、DOW。③如果前面有车切速度小于自车车速,自车减速对减速度有要求,比如3.5m/m2,④如果前车静止了,自车有个跟停距离要求,比如2-3m。试验场有不同曲率的弯道,比如125m、250m、500m的,根据需求跟车行驶,看是否会减速,能不能驶出弯道等。迭代内容:底层通讯、网络管理、诊断、刷写、信息安全、OTA。

qq_43475097的博客 2297

哈夫曼树与哈夫曼编码(C++实现)

哈夫曼树与哈夫曼编码(C++实现) 哈夫曼树的构造方法 1、**对给定的n个权值{W1,W2,W3,…,Wi,…,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,…,Ti,…, Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。 2、在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。 3、从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。 4、重复2)和3),直到集合F中只有一棵二叉树为

CSU_hjh的博客 2861

802.1x之EAP-TLS测试方法

CA证书一般是由权威的认证机构发出,用来验证该机构签名的证书,持有CA证书的设备可以验证对端的证书是否由自己信任的机构颁发的。在我们内部使用证书时,我没可以自己充当CA认证机构,管理私钥和CA证书,使用他们签名服务器、客户端证书。2、使用证书请求文件server_csr.pem、CA私钥、CA公钥生成服务器证书(正常情况下自己不拥有CA私钥,是把证书请求文件发给认证机构,由认证机构返回证书)进行802.1x EAP-TLS认证时需要IPC、服务器分别存储CA证书、设备证书、私钥,通过交换证书实现身份验证。

写作是为了更好的思考 2162

C++实现哈夫曼树

哈夫曼树(Huffman Tree)是一种特殊的二叉树,通常用于数据压缩的哈夫曼编码。在哈夫曼树中,频率(或权重)较高的节点离根节点较远,而频率较低的节点离根节点较近。这样,我们可以为频率较低的节点分配较短的编码,为频率较高的节点分配较长的编码,从而实现数据的压缩。本文将详细介绍如何使用C++实现哈夫曼树,并附有完整的代码。

Weirdo的博客 1409

Silly Tavern(酒馆)AI 角色扮演下载与安装教程(Windows本地部署)

SillyTavern是一款开源AI角色扮演前端工具,支持沉浸式对话和长期角色互动。本文详细介绍了在Windows系统F盘部署SillyTavern的完整流程,包括下载项目、安装Node.js和Git环境、配置路径、启动服务等关键步骤,并特别说明非系统盘路径可能遇到的npm安装问题及解决方法。成功启动后,用户可通过浏览器访问本地地址使用该工具进行AI角色扮演互动。

Tan3851的博客 1万+

YOLOv13改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计

实时检测器架构的轻量级设计GsConv。

Limiiiing的博客 90

哈夫曼树之C++实现

关于哈夫曼树的讲解请参考上篇《三步学通哈夫曼树》(https://blog.youkuaiyun.com/helloworldchina/article/details/105210054),这里笔者仅补充一下C++代码的实现。见下: 1 c++代码 #include <iostream> #include <iostream> #include <iomanip> usi...

helloworldchina的博客 1472

将指定文件夹下每张用LabelImg标注的图片中标注部分抠出来保存到指定文件夹下。

将指定文件夹下每张用LabelImg标注的图片中标注部分抠出来保存到指定文件夹下。

weixin_44119674的博客 437

C++实现哈夫曼树的编码和译码

C++实现哈夫曼树的编码和译码 #include <iostream> #include <map> #include <string> #include <vector> using namespace std; const int INF = 65535; //哈夫曼树 typedef struct Node { int weight; int parent; int lchild; int rchild; }*HuffmanTree; //哈

weixin_45597497的博客 3659

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

哈夫曼树的实现(构建、遍历)(附C++详细实现代码)

哈夫曼树 带权路径长度: 设二叉树有n个带权值的叶子结点,从根节点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和叫做二叉树的带权路径长度。 哈夫曼树的定义:带权路径长度最小的二叉树(也称最优二叉树) 哈夫曼树的构建思路: 1、以权值分别为W1,W2...Wn的n各结点,构成n棵二叉树T1,T2,...Tn并组成森林 S={T1,T2,...Tn},其中每棵二叉树 Ti仅有一个权值为 Wi的...

One_castle的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【C++数据结构】哈夫曼树代码实现

HuffeManTree.h#pragma once #include "Stack.h" // 我自己写的栈 #include "Stack.cpp"template<class T> class CTree { public: CTree(void);public: T data = NULL; int weight = 1; CTree* lNode = nu

乱乱乱世的博客 3822

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

哈夫曼树学习与总结(C++实现)

哈夫曼树 C++代码实现 #include<iostream> #include <stdlib.h> #include <stdio.h> #include <malloc.h> #include <string.h> #include <ctype.h> using namespace std; struct huff { char c;//字符 int data;//权值 int lch, rch,p;//左右孩子节点在数

weixin_43404836的博客 2277

哈夫曼树的C++实现

考古一下,大一用C++写的哈夫曼树,环境VS2017。 main函数里改一下文件路径即可运行,输入的是txt文件,文件里最好不要有中文,不然会显示一堆问号。 但是代码还是有很多问题,当年为了图方便把一些变量和对象搞成了全局的,直接在函数里操作了,这样显然还是不够,还可以改进。 #include<iostream> #include<fstream> #include<...

qq_41672569的博客 721

哈夫曼树相关概念及C++实现

文章目录一,哈夫曼树基本概念二,构造哈夫曼树三,哈夫曼编码四,C++实现哈夫曼树 一,哈夫曼树基本概念 二,构造哈夫曼树 三,哈夫曼编码 四,C++实现哈夫曼树 #include<iostream> using namespace std; #define MaxWeight 100 typedef struct HTNode { int weight; int parent, lch, rch; bool visit; }HTNode, *HuffmanTr

qq_46027243的博客 262
上一篇: 最小堆C++实现
下一篇: 邻接矩阵构造图C++实现
-Gentle-
博客等级 码龄8年 80粉丝 16原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值