二叉树数据结构及哈夫曼树(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

帕塞瓦尔定理(Parseval‘s theorem)的证明

帕塞瓦尔定理(Parseval's theorem)表明了信号在时域和频域上的能量相等。

weixin_42428226的博客 2万+

Python 爬取新浪财经 7x24(1): 下载数据

前言 最近在做一个需要很多财经数据的项目。于是想到可不可以通过爬虫来解决(尝试白嫖)。 提供财经数据的网站有很多个,其中比较靠谱和更新比较及时的应该是新浪7x24 live数据。 http://finance.sina.com.cn/7x24/?tag=0 这个问题有一定的难度,因为这个网页是动态加载的。每一次只会加载部分数据,而只有拉到底部才可以加载新的数据。 于是乎,我们要做的事情是: 下载数据 保存到数据库 本篇介绍如何下载数据。 代码 闲言少叙书归正文,代码的实现如下: import reque

ZJ_11701的博客 2905

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

11。

wyzzlh的博客 174

京东商品多维特征提取:基于时空大模型的实时库存预测接口设计

在电商行业,库存管理是供应链的核心环节之一。库存水平过高会导致资金占用、仓储成本增加,而库存水平过低则可能引发缺货风险,影响客户满意度和平台声誉。京东作为中国领先的电商平台,拥有海量的商品数据和复杂的业务场景,传统的库存预测方法难以应对市场动态变化和业务需求。时空大模型作为一种融合时间序列分析和空间特征提取的前沿技术,能够捕捉商品多维特征在时空维度上的变化规律,为实时库存预测提供更精准的决策依据。

FB13713612741的博客 954

数据结构-哈夫曼树

计算带权路径长度方法:第一棵树:有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

TEC 高精度控温算法:实现精准升降温与恒温控制

本文深入解析了TEC高精度控温算法的核心原理与工程实践。针对TEC非线性、时变的特性,算法通过智能状态机实现精准升降温与恒温控制,并详细阐述了参数整定、硬件协同及调试优化的系统性方法,为半导体激光器、PCR仪等高精度温控应用提供了一套完整的解决方案。

weixin_29212867的博客 1013

CATIA CAA 二次开发去除面内开孔

测试模型: 代码说明:以下代码在拓扑级去除Face的内部loop,更改后的Body通过oispBody参数输出。主要使用CATSmartBodyDuplicator拓扑操作实现 HRESULT CAAStarterCmd::RemoveHoleOnFace(CATBody_var &ispBody,CATBody_var &oispBody){ CATLISTP(CATCell)olistFace; ispBody->GetAllCells(olistFace,2); CATF

weixin_45445751的博客 2265

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

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

qq_59959075的博客 1384

为什么桥式传感器(Bridge Sensor)需要用到仪表放大器?

仪表放大器在桥式传感器的应用里起到关键作用,本文介绍桥式传感器的原理、特性,以及信号调理过程,并附上了一个 TINA - TI 的仿真电路。

疯狂的运放 1528

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

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

Ultravioletrays的博客 1869

【现代人形机器人:从物理建模到大模型驱动的控制与学习】第1章 机器人建模回顾

本章建立读者进行后续控制 / 优化 / 学习工作的数学与计算基础。内容分为三大块:刚体运动学:位姿表示、坐标变换、旋转参数与李代数/李群(指数映射、twist)多关节机构的正/逆运动学:DH 与 POE 两种建模、雅可比矩阵推导、数值/解析逆解方法与奇异性问题约束动力学:拉格朗日公式、牛顿—欧拉递归算法、接触/冲击模型、受约束系统的方程(拉格朗日乘子与互补性条件)每一节同时给出与练习题。假设读者已具备线性代数(矩阵、特征分解、SVD)、多变量微积分与基础力学(牛顿第二定律)知识。

u012133341的博客 185

PD3.0详解 协议的时序timer和counter计数

前面介绍了关于PD协议的交互,还有协议层数据各个字段的含义,但是一直没有系统的说关于协议的时序,还有部分counter,就是协议允许发送的次数,或者一些其他计数。 大师匈今天说一下关于这方面的东西,这些东西都是非常关键的东西,但是相对来说PD标准内对时序的要求还是比较宽泛,非常容易能够实现这样的要求。 Timer 1、CRCReceiveTimer 0.9~1.1ms 表示每次通信收到goodcrc的时间,必须在这个时间内收到goodcrc, 我们要注意不是在0.9~1.1ms内,而是第三方可以在这个范

大师匈的博客 5007

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

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

Haru_Yuki的博客 1837

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

Panzer_Jack的博客 264

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

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、付费专栏及课程。

余额充值