二叉树数据结构及哈夫曼树(C++代码)

数据结构c++线性表 简单树 特殊树 简单图 链表:单链表、双向链表、循环链表 栈 队列 树的定义及其相关概念 树的父亲表示法 二叉树的定义及其基本性质 二叉树的孩子表示法等 关于c++数据结构的干货 链表是一种线性数据结构,不同于数组,链表的元素(通常称为节点)在内存中不是连续存储的。每个节点包含两部分:数据和指向下一个节点的指针(在双向链表中还可能有指向前一个节点的指针)。链表允许动态地添加、删除元素,相比数组更加灵活。链表作为一种重要的数据结构,可以在不同情况下提供灵活的存储和操作方式。单链表、双向链表和循环链表都有各自的特点,根据实际需求选择合适的链表类型。在 C++ 中,我们可以利用指针和动态内存分配来实现这些链表,从而更好地应对问题的复杂性。 阅读详情

二叉树作为非线性数据结构,是以分支关系定义层次结构,以下重点为二叉树的存储结构及基本操作,以及树与二叉树之间的转化,最后介绍特殊的树结构——哈夫曼树。

目录

 二叉树的定义及基本操作

树与二叉树之间的转化

哈夫曼树


满二叉树:深度为k且含有(2^k)-1个结点的二叉树

完全二叉树:深度为k,有n个结点的二叉树,利用层次遍历,二叉树每一个结点与编号一一对应,如下图(b):

查看源图像

 存储方式:顺序存储(适合完全二叉树)和链式存储(又叫二叉链表)

 

 二叉树的定义及基本操作

#pragma once
#include<iostream>
using namespace std;

const int ERROR = 0;
const int OK = 1;
typedef char ElemType;

class BiTNode
{

public:
	ElemType data;
	BiTNode* lchild;
	BiTNode* rchild;
};

class BiTree
{
public:
	BiTree();
	BiTNode* CreateBiTree();//先序创建二叉树
	
	BiTNode* GetRoot();//获得根结点
	int GetBiTNum();//获得结点个数


	void PreOrderTraverse(BiTNode* node);//先序遍历
	void InOrderTraverse(BiTNode *node);//中序遍历
	void PosOrderTraverse(BiTNode* node);//后序遍历

	BiTNode* Copy(BiTNode* node);//二叉树复制
	int Depth(BiTNode* node);//计算二叉树的深度
	int NodeCount(BiTNode* node);//计算结点个数
	int LeadCount(BiTNode* node); //计算叶子节点个数
	
	bool IsSymmetric();//判断一棵二叉树是否是对称二叉树
	bool IsSymmetrical(BiTNode* node1, BiTNode* node2);//两步走

	void DestoryBiTree(BiTNode* node);//销毁二叉树

private:
	BiTNode* root;                      //二叉树的根节点
	int m_size;                         //二叉树的大小
                                        //二叉树的深度
};

BiTree::BiTree()
{
	this->root = nullptr;
	this->m_size = 0;
}

BiTNode* BiTree::CreateBiTree()
{
	BiTNode* T;
	T = new BiTNode;
	if (this->root == nullptr)
		cout << "请输入根节点(#代表空树):";
	else
		cout << "请输入节点(#代表空树):";
	ElemType ch; cin >> ch;
	if (ch == '#') T = nullptr;
	else
	{
		T->data = ch;
		this->m_size++;
		if (this->root == nullptr)
			root = T;
		T->lchild = this->CreateBiTree();
		T->rchild = this->CreateBiTree();
	}
	return T;
}

int BiTree::GetBiTNum()
{
	return this->m_size;
}

BiTNode* BiTree::GetRoot()
{
	return this->root;
}

void BiTree::PreOrderTraverse(BiTNode* node)
{
	if (node)
	{
		cout << node->data << "\t";
		this->PreOrderTraverse(node->lchild);
		this->PreOrderTraverse(node->rchild);
	}
}

void BiTree::InOrderTraverse(BiTNode* node)
{
	if (node)
	{
		this->InOrderTraverse(node->lchild);
		cout << node->data << "\t";
		this->InOrderTraverse(node->rchild);
	}
}

void BiTree::PosOrderTraverse(BiTNode* node)
{
	if (node)
	{
		this->PosOrderTraverse(node->lchild);
		this->PosOrderTraverse(node->rchild);
		cout << node->data << "\t";
	}
}

BiTNode* BiTree::Copy(BiTNode* node)
{
	BiTNode* temp;
	temp = new BiTNode;
	if (!node)
		temp= nullptr;
	else
	{
		if (!this->root)
			this->root = temp;
		temp->data = node->data;
		this->m_size++;
		temp->lchild = this->Copy(node->lchild);
		temp->rchild = this->Copy(node->rchild);
	}
	return temp;
}

int BiTree::Depth(BiTNode* node)
{
	int m=0, n=0;
	if (!node)
		return 0;
	else
	{
		m = this->Depth(node->lchild);
		n = this->Depth(node->rchild);
		if (m > n)
			return m + 1;
		else
			return n + 1;
	}
}
int BiTree::NodeCount(BiTNode* node)
{
	if (!node)
		return 0;
	else
		return NodeCount(node->lchild) + NodeCount(node->rchild) + 1;
}

int BiTree::LeadCount(BiTNode* node)
{
	if (!node)
		return 0;
	if ((node->lchild == nullptr) && (node->rchild ==nullptr))
		return 1;
	else
		return NodeCount(node->lchild) + NodeCount(node->rchild);
}

bool BiTree::IsSymmetric()
{
	if (this->root == nullptr)
		return true;
	return this->IsSymmetrical(root->lchild, root->rchild);
}

bool BiTree::IsSymmetrical(BiTNode* node1, BiTNode* node2)
{
	if (node1 == nullptr && node2 == nullptr)
		return true;
	if (node1 == nullptr || node2 == nullptr)
		return false;
	if (node1->data != node2->data)
		return false;
	return this->IsSymmetrical(node1->lchild, node2->rchild) && this->IsSymmetrical(node2->lchild, node2->rchild);
}

void BiTree::DestoryBiTree(BiTNode* node)
{
	if (node == nullptr)
		return ;
	DestoryBiTree(node->lchild);
	DestoryBiTree(node->rchild);
	delete node;
}

树与二叉树之间的转化

#pragma once
#include <iostream>
#include<stack>
using namespace std;

typedef char ElemType;

class CSNode
{
public:
	ElemType data;
	CSNode* firstchild;
	CSNode* nextsibling;
};

class Tree
{
public:
	Tree() { this->root = nullptr; }
	CSNode* CreateTree();//创建树
	CSNode* GetRoot();
	
	void PreTree(const CSNode* T);//先根遍历
	void MidTree(const CSNode* T);//中根遍历


private:
	CSNode* root;
};



CSNode* Tree::CreateTree()
{

	CSNode* p;
	p = new CSNode;
	cout << "输入结点数据:" ;
	cin >> p->data;
	if (p->data == '#')
		p = nullptr;
	else
	{
		if (this->root == nullptr) 
			root = p;
		p->firstchild = this->CreateTree();
		p->nextsibling = this->CreateTree();
	}
	return p;
}
CSNode* Tree::GetRoot()
{
	return this->root;
}

void Tree::PreTree(const CSNode* T)
{
	if (T)
	{
		cout << T->data << "\t";
		this->PreTree(T->firstchild);
		this->PreTree(T->nextsibling);
	}
}
void Tree::MidTree(const CSNode* T)//相当于二叉树的中序遍历
{
	if (T)
	{
		this->MidTree(T->firstchild);
		cout << T->data << "\t";
		this->MidTree(T->nextsibling);
	}
}


int main()
{ 
	Tree K1;
	K1.CreateTree();
	K1.PreTree(K1.GetRoot());
	cout << endl;
	K1.MidTree(K1.GetRoot());
	system("pause");
	return 0;
}

哈夫曼树

哈夫曼树虽然也是二叉树,但是他加上约束条件,就是带权路径长度WPL最短,由于哈夫曼树中没有结点度为1的结点,即一棵有n个叶子结点的哈夫曼树,共有n+(n+1)个结点,将其存储在定长的数组中,即采用顺序存储结构,每一个数组单元存储结点信息。

 注意:如果想存储哈夫曼编码的信息,还需要附加一个node信息;

构造森林全是根,选择两小造新树,删除两小添新人,重复(2)(3)剩单根;

哈曼夫树的建立、存储及求出由哈夫曼树逆向的哈夫曼代码

哈夫曼编码的相关理论和原理可参考诸多数据结构与算法。 

#pragma once
#include<iostream>
#include<string>
using namespace std;

const int ERROR = 0;
const int OK = 1;
typedef char ElemType;

class HTNode
{
public:
	int weight;
	int parent;
	int lchild;
	int rchild;
	string code;
};

class HuffmanTree
{

public:
	HuffmanTree() { this->HT = nullptr; }
	void CreatHuffmanTree(int n);//构造哈夫曼树
	void Select(int value,int& s1, int& s2);
	/*[选择]出双亲为0,且权值最小的两个结点s1和s2
	[删除]将s1和s2的双亲改为非0,这样在第一步选择的时候,就筛选不到他们俩了
	*/
	//[合并]就是将s1和s2的权值作为新节点的权值存入到第n + 1之后的数组中
	//这个就是返回到构造哈夫曼树的函数里边了Select只完成[选择]和[删除]两步
	void Print(int n);//打印哈夫曼树

	//哈夫曼树的知识点函数
	//1.根据哈夫曼树求哈夫曼编码,形成哈夫曼编码表
	//2.在哈夫曼编码表的基础上,对数据文件进行编码
	//3.在哈夫曼编码表的基础上,对数据文件进行译码
	void CreatHuffmanCode(int n);//形成哈夫曼编码表存在HC中

private:
	HTNode* HT;
};

void HuffmanTree::CreatHuffmanTree(int n)
{
	if (n <= 1)return;
	int m = 2 * n - 1;
	HT = new HTNode[m+1];//开辟了2n个结点空间,但是我0位置不用,只用1~m个空间
	//这2n个空间的初始化工作
	for (int i = 0; i <= m; i++)
	{
		HT[i].parent = 0; HT[i].lchild = 0; HT[i].rchild = 0; HT[i].code = "";
	}
	for (int i = 1; i <= n; i++)
	{
		cout << "请输入第" << i << "个结点的权重:" ;
		cin >> HT[i].weight;
	}
	//通过n-1次选择,删除,合并来创建哈夫曼树
	for (int j = n + 1; j <= m; j++)
	{
		int s1, s2;
		this->Select(j, s1, s2);
		HT[s1].parent = j;//两个结点有了双亲
		HT[s2].parent = j;
		HT[j].lchild = s1;//双亲也有了自己的孩子和权重
		HT[j].rchild = s2;
		HT[j].weight = HT[s1].weight + HT[s2].weight;
	}

}

void HuffmanTree::Select(int value, int& s1, int& s2)
{
	for (int i = 1; i < value; i++)
	{
		if (this->HT[i].parent == 0)
		{
			s1 = i;
			break;//先找到一个双亲是0的结点,就跳出循环,甭管他的权重值,先找到一个,去进行下边的循环比较
		}
	}
	for (int i = 1; i < value; i++)
	{
		if (this->HT[i].parent == 0 && HT[i].weight < HT[s1].weight)
		{
			s1 = i;//这样的话就找到了权值最小的下标索引
		}
	}
	for (int j = 1; j < value; j++)
	{
		if (this->HT[j].parent == 0&&j!=s1)
		{
			s2 = j;
			break;//先找到一个双亲是0的结点,就跳出循环,甭管他的权重值,先找到一个,去进行下边的循环比较
		}
	}
	for (int j = 1; j < value; j++)
	{
		if (this->HT[j].parent == 0 && HT[j].weight < HT[s2].weight&&j!=s1)
		{
			s2 = j;//这样的话就找到了权值第二小的下标索引
		}
	}
}

void HuffmanTree::Print(int n)//给你的输出结果,顺序存储结构是一个数组,那么也就是数组中元素的打印
{
	//输出打印那个HT数组
	int m = 2 * n - 1;
	cout << "结点" << "\t" << "weight" << "\t"
		<< "parent" << "\t" << "lchild" << "\t" << "rchild" << "\t" << "HuffmanCode"<<endl;
	for (int j = 1; j <= m; j++)
	{
		cout << j << "\t" << HT[j].weight << "\t" << HT[j].parent << "\t" << HT[j].lchild << "\t" << HT[j].rchild << "\t"<<HT[j].code << endl;
	}
}

void HuffmanTree::CreatHuffmanCode(int n)//哈夫曼编码的形成
{
	char* cd;
	cd = new char[n];
	cd[n - 1] = '\0';
	for (int i = 1; i <= n; i++)
	{
		int temp = i; 
		int start = n - 1;
		int f = HT[i].parent;
		while (f!=0)
		{
			start--;
			if (HT[f].lchild == temp) cd[start] = '0';
			else cd[start] = '1';
			temp = f;
			f = HT[f].parent;
		}
		while (cd[start]!='\0')
		{
			HT[i].code += cd[start];
			start++;
		}
	}
	delete[]cd;
}

严蔚敏《数据结构》六类核心实验C++实现+图文报告(含链表、树、图、排序等) 这套资料直接对应严蔚敏《数据结构》教材教学进度,提供线性表、栈与队列、树与二叉树、图、查找、排序六大模块的完整上机实践支持。包含20多个可直接编译运行的C++工程,比如单链队列实现、哈夫曼编码生成、二叉树建立与先序/中序/后序遍历、结点数量统计、树深度计算、图的邻接表创建、深度优先与广度优先遍历、直接插入/选择/冒泡/快速排序算法实现、字符频次统计与翻译功能等。每个实验都配有独立文档说明,涵盖功能目标、算法逻辑、输入输出样例和运行结果分析。代码统一使用main.cpp入口,头文件head.h集中管理常用结构 阅读详情

相关推荐

利用二叉树结构实现赫夫曼编/解码器。

利用二叉树结构实现赫夫曼编/解码器。 基本要求: 1、 初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立赫夫曼树 2、 建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。 3、 编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。 4、 译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。 5、 打印(Print):以直观的方式打印赫夫曼树(选作) 6、 计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。 测试数据: I love data Structure, I love Computer. I will try my best to study data Structure.

二叉链表实现哈夫曼树

【代码】二叉链表实现哈夫曼树。

weixin_74370136的博客 611

c++实现huffman哈夫曼编码

利用c++实现了Huffman编码,并对代码进行了注释,保证可读性。 {4,2,13,3,7,10,8,23,22,35,52,31} 下面是编码结果: 第1个数的huffman编码是:00000 第2个数的huffman编码是:000010 第3个数的huffman编码是:0110 第4个数的huffman编码是:000011 第5个数的huffman编码是:01110 第6个数的huffman编码是:0001 第7个数的huffman编码是:01111 第8个数的huffman编码是:010 第9个数的huffman编码是:001 第10个数的huffman编码是:111 第11个数的huffman编码是:10 第12个数的huffman编码是:110

24 哈夫曼树的建立(二叉链表)

24哈夫曼树的建立(二叉链表) 作者:冯向阳时间限制:10S章节:DS:树 截止日期:2022-06-30 23:55:00 问题描述 : 内容:请参照二叉树的ADT模板,设计Huffman树的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的二叉树ADT原型文件,自行设计Huffman树的ADT。) 应用:要求设计一个算法,使用动态存储的方式,实现Huf...

Ultravioletrays的博客 1852

基因家族快速鉴定指南:Windows平台下的HMMER实战解析

本文详细解析了在Windows平台下使用HMMER工具进行基因家族快速鉴定的完整实战流程。通过手把手指导,从软件获取、数据准备到模型构建与序列搜索,帮助生物信息学新手无需Linux环境,即可高效完成bZIP转录因子等家族的鉴定工作,大幅降低分析门槛。

weixin_29255731的博客 460

Rosetta基础2:preparing ligand

Rosetta是基于残基,也就是说Rosetta不把原子单独对待,而是把它们看作一个完整的化学实体。为了实现这个目标,Rosetta必须知道键长、键角以及其它性质。对标准残基和小分子残基模型都是必须的。Rosetta在params文件中对残基的性质进行编码。Rosetta数据库包含常见氨基酸残基和小分子残基的parmas文件。当我们添加新的配体时,需要生成新的parms文件。 What is a Params File params文件包含残基的几何形状和化学特征的信息,为了让Rosetta理解怎样运行这个

li1guangjun的博客 1755

哈夫曼树采用二叉链表存储,求哈夫曼树带权路径长度

11。

wyzzlh的博客 174

深入构建加密货币价格预测系统:从数据获取到模型优化的完整指南!

🏆本文收录于「编程与技术实战」专栏,此专栏涵盖了C/C++编程、人工智能、数据结构、机器学习等技术领域的内容,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1276

数据结构-哈夫曼树

计算带权路径长度方法:第一棵树:有4个结点1,3,4,5;从顶点到权重为1的点需要经过两条边;所以权重为1的结点;结点路径长度是1*2=2;其他结点从顶点到最后也是经过两条边;所以带权路径长度是1*2+3*2+4*2+5*2 = 26;第二棵树:从顶点到权重为5的结点长度是1;顶点到4的长度是2;顶点到1的长度是3;顶点到3的长度是3;所以带权路径长度是:1*5+2*4+3*1+3*3 = 25;所以称中间两棵树是哈夫曼树;或者是 最优二叉树。其他几个树带权路径的计算长度也是一样的。

sun_weitao的博客 1841

实战解析:如何通过LTspice仿真优化MOS管缓启动电路,解决上电冲击电流问题

本文详细解析如何通过LTspice仿真优化MOS管缓启动电路,有效解决上电冲击电流问题。文章从问题根源分析入手,介绍LTspice环境搭建、缓启动电路设计原理、参数优化技巧及实际工程问题排查,帮助工程师掌握MOS管电源开关电路的关键设计方法,提升系统可靠性和性能。

weixin_28683689的博客 515

深入解析JESD204B Subclass 1中的SYSREF与LMFC同步机制

本文深入解析了JESD204B Subclass 1协议中的核心同步机制,重点阐述了SYSREF信号如何作为系统级参考,对齐所有设备内部的本地多帧时钟(LMFC),从而实现高速多通道数据采集系统中的确定性延迟。文章结合实战经验,详细说明了硬件设计、时序要点及软件配置流程,是解决多ADC芯片同步对齐问题的关键指南。

weixin_29271263的博客 398

8. 二叉树和哈夫曼树-数据结构入门(c语言实现)

二叉树由一个根节点和两棵互不相交的称为左子树和右子树的二叉树组成。

qq_59959075的博客 1384

ICC2:postmask ECO参考脚本

更多学习内容请关注「拾陆楼」知识星球。

m0_61544122的博客 883

构建哈夫曼树C++ 完整的代码(仅构建不是遍历)

有几个重要的函数模块 initialize()为我们的哈夫曼树先开辟空间初始化 但此时还没有开始构建哈夫曼树 input()输入我们哈夫曼树的数据 但还没开始构建哈夫曼树 select()寻找权重最小 次小的两个结点 creat()构建我们的哈夫曼树 但要用到select 最难的是select函数和creat函数 把这两个理解好了就行了 其他两个函数都很简单。 首先要理解哈夫曼树的话 你不能用二叉树的知识去理解 因为二叉树类似链表链接 而这个哈夫曼树和数组很像 所以你要分开理解 不要混在...

Ultravioletrays的博客 1869

基于Python的彭博社新闻高效爬取实战:最新技术与完整代码解析

本文将详细介绍如何使用Python最新技术构建一个高效的彭博社(Bloomberg)新闻爬虫系统。我们将从爬虫基础概念讲起,逐步深入到高级反反爬技术、异步抓取、数据解析与存储等核心环节。文章包含完整的代码实现,采用最新的aiohttp、Playwright等技术栈,并特别关注法律合规性和数据质量保障。通过本文,读者将掌握一个完整的商业新闻爬虫开发流程,并能够根据实际需求进行定制化开发。关键词:Python爬虫、彭博社、Bloomberg、新闻采集、aiohttp、Playwright、反反爬技术。

2201_76125261的博客 1503

Python全栈入门到实战【进阶篇 1】类与对象:面向对象编程的基石

Python中定义类使用**class关键字**,创建对象使用**类名()**(类似调用函数),语法简洁,我们从最基础的空类开始,逐步拆解。class# 定义空的学生类,pass表示占位,无实际内容 class Student : pass编码规范:类名遵循大驼峰命名法(每个单词首字母大写,无下划线),如StudentCarPhone,这是Python官方推荐的PEP8规范,便于区分类和其他标识符。实例方法必须定义在类内部;实例方法的第一个参数必须是self(名称可自定义,如this。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 3405

数据结构与算法期末复习总结三

树是n(n>=0)个结点的有限集。当n = 0时,称为空树。有且仅有一个特定的称为根的结点。当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树。显然,树的定义是递归的,即在树的定义中又用到了自身,树是一种递归的数据结构。树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。树中所有结点可以有零个或多个后继。因此n个结点的树中有n-1条边。

Haru_Yuki的博客 1837

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

wpl计算方法_C++哈夫曼树WPL的计算 求代码

匿名用户1级2010-12-03 回答#includeusing namespace std;struct node{int w;int flag;int lchild,rchild;int parent;};node huff[1001];int n;void read(){int i;cout<cin>>n;for(i=1;i<=n;i++)cin>>huf...

weixin_42236063的博客 684

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【数据结构与算法】2. 树[笔记]

【数据结构与算法】2.树[笔记]

Panzer_Jack的博客 264

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构——被优先队列玩起来的“树“

系统的分析堆和优先队列,手动模拟堆的实现,总结用于期末考试中的树的知识点

weixin_52621323的博客 1743

HuffmanTree

哈夫曼树 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 哈夫曼树的生成 这里采用最小堆进行生成 事先把带权值的结点生成最小堆 然后,如下 HuffmanTree Huffman(MinHeap& H) { int i; ...

CodePandas 178

数据结构~树

数据结构~树(1)

weixin_43624549的博客 181

王道考研机试指南重写

王道考研机试指南重写前言数据结构一章栈的应用括号匹配问题简单计算器 前言 几年前因为应付有些学校的机试,大致刷了一遍《王道考研机试指南》里代码王道考研机试指南代码合集。几年过去了想重新刷一遍,加强算法能力,同时也熟悉c++的新特性。以下代码更多的不是算法效率,而是尽可能使用一些新特性并保持代码规范(尝试规范)。......

最佳损友1020的博客 3735

指针的一些应用以及以单链表为基础的变化

一些对指针和链表的理解,有单链表,二叉树,循环链表的部分C++代码

m0_63823490的博客 101

数据结构期末复习三------哈夫曼树与WPL

哈夫曼树又名最优二叉树,指的是当叶子结点带有权值时,通过已知的叶子结点以及相应的权值可以构造出来的带权路径长度最小的二叉树。这就要求权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。

2401_83961434的博客 1182

哈夫曼编码系统 C++实现

最近的数据结构大作业… 其中涉及到了很多,像一些哈夫曼树的编码、译码,以及树的二叉树形式的存储及恢复。。 [基本要求] 一个完整的系统应具有以下功能: (1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。 (2)E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件htmTree中读入),...

Gao_HongXiang 2533
上一篇: 串的数据结构及模式匹配算法(C++)
下一篇: 图的存储结构C++实现
Worthwhile_HUST
博客等级 码龄5年 53粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值