数据结构-树和二叉树-Huffman树

数据结构(C语言第2版) 课后习题答案之第五章 树和二叉树 目录 第5章 树和二叉树 一、选择题 二、应用题 (1)试找出满足下列条件的二叉树 (2)设一棵二叉树的先序序列: A B D F C E G H ,中序序列: B F D A G E H C (3) 假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。 (4)已知下列字符A、B、C、D、E、F、G的权值分别为3、12、7、4、2、8,11,试填写出其对应哈夫曼树HT的存储结构的初态和终态。 ... 阅读详情

树和二叉树

Huffman 树

赫夫曼(Huffman)树,又称最优树,是一类带权路径长度最短的树,有着广泛的应用。

路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。

路径长度:路径上分支的数目构成路径长度。

树的路径长度:树根到每一个节点的路径长度之和。

树的带权路径长度:树中所有叶子节点的带权路径长度之和,记作WPL=∑k=1nwklkWPL = \sum_{k=1}^{n}w_kl_kWPL=∑k=1n​wk​lk​

最优二叉树或赫夫曼树:假设有n个权值{w,w,...,w.}\left \{w,w,...,w.\right \}{w,w,...,w.},试构造一棵有n个叶子结点的二叉树,每个叶子结
点带权为wiw_iwi​,则其中带权路径长度WPL最小的二叉树称做最优二叉树或赫夫曼树。

在这里插入图片描述

构造霍夫曼树

霍夫曼最早给出了一个带有一般规律的算法,俗称霍夫曼算法。

现叙述如下:
(1)根据给定的n个权值(w1,w2,...,wn)(w_1,w_2,...,w_n)(w1​,w2​,...,wn​)构成n棵二叉树的集合F={T1,T2,…Tn}F=\left \{T_1,T_2,…T_n\right \}F={T1​,T2​,…Tn​},其中每棵二叉树TiT_iTi​中只有一个带权为wiw_iwi​的根结点,其左右子树均空。
(2)在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
(3)在F中删除这两棵树,同时将新得到的二叉树加入F中。
(4)重复(2)和(3),直到F只含一棵树为止。这棵树便是赫夫曼树。

Huffman编码

前缀编码:要设计长短不等的编码,则必须是任一个字符的编码都不是另一个字符的编码的前缀,这种编码称做前缀编码。

//-----赫夫曼树和赫夫曼编码的存储表示-----
typedef struct {
    unsigned int weight;
    unsigned int parent, lchild, rchild;
}HTNode, *HuffmanTree;    //动态分配数组存储霍夫曼树
typedef char * * HuffmanCode; // 动态分配数组存储霍夫曼编码表
//求huffman编码的算法如下所示
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC,int *w, int n){
    // w 存放 n个字符的权重(均>0),构造huffman树HT,并求出 n个字符的huffman编码HC
    if (n<=1) return ; // 节点小于等于 1的返回None
    m = 2 * n -1;// 树节点的个数
    HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode));  //0号单元未用 ,申请(m+1)*htnode尺寸的内存
    for (p = HT, i = 1; i<=n; ++i,++p,++w) *p = {*w, 0, 0 , 0};// 构造n个二叉树,值为w;parent,lchild,rchild都为 0 
    for (;i<=m; ++i ,++p) *p = {0,0,0,0};// 从n到m之间的二叉树权重,parent,lchild,rchild 都置为0
    for (i = n+1; i<=m;++i){//建huffman树
        	//在HT[1..i-1]选择parent 为0 且weight 最小的两个节点,其序号分别为s1和s2.
        Select(HT,i-1, s1,s2); 
        HT[s1].parent=i;HT[s2].parent = i; // 最小的两个节点其父节点置为i,
        HT[i].lchild = s1; HT[i].rchild = s2; // 节点i的左节点置位s1,右节点置为s2
        HT[i].weight = HT[s1].weight+ HT[s2].weight; //节点i的权重为 左右子节点权值相加
    }
    //---从叶子到根逆向求每个字符的赫夫曼编码---
	HC=(HuffmanCode)malloc((n+1)*sizeof(char*));//分配n个字符编码的头指针向量
	cd=(char*)malloc(n*sizeof(char));
	//分配求编码的工作空间
	cd[n-1]="\0";
	//编码结束符。
	for(i=1;i<=n;++i){
		//逐个字符求赫夫曼编码
		start=n-1;
		//编码结束符位置
		for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)//从叶子到根逆向求编码
			if(HT[f].lchild==c) cd[--start]="0";
			else cd[--start]="1";
			HC[i]=(char*)malloc((n-start)*sizeof(char));//为第i个字符编码分配空间
			strcpy(HC[i],&cd[start]);			//从cd复制编码(串)到HC
		}
		free(cd);//释放工作空间
		
}//HuffmanCoding
例题

例 已知某系统在通信联络中只可能出现8种字符,其概率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计赫夫曼编码。

设权w=(5,29,7,8,14,23,3,11),n=8,则m=15,按上述算法可构造一棵赫夫曼树如图6.26所示。其存储结构HT的初始状态如图6.27(a)所示,其终结状态如图6.27(b)所示,所得赫夫曼编码如图6.27 (c)所示。

在这里插入图片描述

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p4TlL64T-1632650370957)(image-20210926175446048.png)]

【知识点8】哈夫曼树⭐⭐⭐⭐⭐ 目录哈夫曼树问题引入——合并果子哈夫曼树的构造哈夫曼编码参考资料 哈夫曼树 问题引入——合并果子 带权路径长度:叶子结点的权值乘以其路径长度的结果; 树的带权路径长度(Weighted Path Length of Tree,WPL):树的所有叶子结点的带权路径长度之和。 于是,我们合并果子的问题就转换成: 已知n个数,寻找一棵树,使得树的所有叶子结点的权值恰好为这n个数,并且使得这... 阅读详情

相关推荐

哈夫曼树算法

哈夫曼树的节点结构 结点结构由:weight(权值),lchild(左孩子结点下标),rchild(右孩子结点下标),parent(双亲结点下标)。 struct ElemType { int weight; //假定权值为整数 int parent,lchild,rchild; //游标 } 哈夫曼算法代码 void HuffmanTree(ElemType huffTree[],int w[],int n) { int i,k,i1,i2;

qq_51344334的博客 1041

【笔记】哈夫曼树

哈夫曼树的概念 哈夫曼树的构造算法 哈夫曼编码 哈夫曼编码算法的实现

time-space的博客 1万+

树的应用——哈夫曼编码

一、 实验题目: 树的应用——哈夫曼编码 二、 实验内容: 利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息传输的时间,降低传输成本。根据哈夫曼编码的原理,编写一个程序,在用户输入结点权值的基础上求哈夫曼编码。 从键盘输入若干字符及每个字符出现的频率,将字符出现的频率作为结点的权值,建立哈夫曼树,求出各字符的哈夫曼编码。要求: 1. 输出存放哈夫曼树的数组HT的初态和终态; 2. 输出每个字符的哈夫曼编码; 3. 输入由上述若干字符组成的字符串,对电文进行编码并输出; 4. (选作)输入电文的哈夫曼编码,进行译码并输出。

数据结构--树和二叉树--求解Huffman树和Hffman编码

首先给出Huffman树的定义:

littlebeat123的专栏 791

免安装版Notepad++终极配置:右键菜单+图标美化+多文件批量处理(2024新版)

本文详细介绍了如何为免安装版Notepad++进行终极配置,包括右键菜单添加、图标美化以及多文件批量处理功能。通过注册表编辑和高级定制,用户可以在便携版中实现与安装版相同的功能体验,同时保持系统整洁。特别适合开发者、系统管理员和效率追求者使用。

nut55的博客 830

《LangChain技术原理剖析:OpenAI Function Calling的实践与应用》

,"unit": {},name:函数的唯一标识符:自然语言描述,决定LLM如何选择该函数parameters:定义输入参数的完整Schema。

qq_62223405的博客 980

数据结构-树

森林是一种图的特殊类型,它由若干棵不相交的树(无环的连通图)组成。每一棵树称为森林的一颗树。在森林中,树与树之间没有边相连,即森林是由多棵树组成的非连通图。树的父指针表示方式它以一组连续的存储单元来存放树中的结点,每个结点有两个域:一个是data域,用来存放数据元素;另一个是parent域,用来存放指示其父结点位置的指针。树中结点的存放顺序一般不做特殊要求,但为了操作实现的方便,有时也会规定结点的存放顺序。例如,可以规定按树的前序次序存放树中的各个结点,或规定按树的层次次序安排所有结点。

qq_46895011的博客 1292

软件工程实验报告--用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

m0_73814332的博客 4160

数据结构---->树

树 树结构中数据元素之间的逻辑关系是前驱唯一而后续不唯一,即数据元素之间是一对多的关系。如果直观的观察,树结构是具有分支的层次结构。树结构在客观世界中广泛存在,如行政区划、社会组织机构、家族世系等都可以抽象为树结构。 一、树的定义及基本术语 树是由一个集合以及在该集合上定义的一种关...

721

手把手教你用STM32CubeMX配置WS2812的PWM+DMA驱动(附完整代码)

本文详细介绍了如何使用STM32CubeMX配置PWM+DMA驱动WS2812全彩灯带,包括硬件选型、STM32F103C8T6的时钟配置、定时器与PWM设置、DMA传输优化等关键步骤,并提供了完整的代码实现和常见问题解决方案,帮助开发者高效控制WS2812灯带。

weixin_30859423的博客 440

WRF后处理总结:wrf-python与NCL在WRF后处理中的基本应用——变量提取、计算与可视化

判断需要提取的变量与诊断量确定后,使用getvar函数进行提取。可使用ncdump-h命令查看wrfout中的变量,wrf中的诊断量分类也可从官方文档处查阅。判断绘图类型所需的可视化绘图类型,决定了你在WRF后处理中的计算步骤。1D点线图:ll_to_xy interpline2D填色图:interplevel3D剖面图:vinterp vertcross绘图、美化色标、XY轴、标签的设置等等。

weixin_43750300的博客 1万+

数据结构总结复习(树)

这块没啥好说的,主要是自己要搞清楚这三种的概念,明确这三种是对于任何一个子树都成立的,所以当它进行判断后进入它的子树,它的子树要再次进行判断,判断依据依旧相同。所以下面它的三种基本操作是,生成一棵单结点树(自己只和自己有关系),找到所在树节点(找到与自己有关的根结点),合并两棵树(两棵树的根结点之间的关系改变)。)以及有的学校会把根结点算作第1层,有的会算作第0层,我这边按第0层来算。对于完全二叉树来说,i结点的左孩子的序号是2i,右孩子的序号是2i+1,按照这样的序号,可以看作把数据存储到一个数组中。

allfortoday的博客 795

EFR32BG22 Thunderboard开发板 使用SPI 读取加速度计

Simplicity Studio v5 创建Silicon Labs蓝牙SoC EFR32BG22 Thunderboard模块的加速度计工程,模块上有一个ICM-20648 6轴运动跟踪设备,集成3轴加速度计和3轴陀螺仪功能,使用SPI接口跟EFR32BG22芯片连接。 我尽量以图片的形式展示(少打字): 将EFR32BG22的Thunderboard模块通过USB线插入到电脑,打开Simplicity Studio v5软件。 下面看重点: 点击搜索到的IO Stream: USART,点击Ins

qq_25727979的博客 1494

第五章 二叉树、树和森林

1.二叉树、树和森林的定义   (1)树的定义:树是n(n>=0)个结点的有限集。当n=0时,称为空树,任何一棵树都应满足:       ①有且仅有一个特定的称为根的结点。       ②当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2,...,Tm,其中每个集合本身又是一棵树,并且称为根的子树。   (2)二叉树的定义:二叉树是每个结点最多只有两颗子树,并且...............

空梦❤的博客 3636

距离多普勒谱(RD谱)绘制方法及理解

RD谱是信号处理领域常用的图形。原始信号往往是一维时域序列,如何将其二维化,并进行变换生成RD谱呢?由于刚刚接触,查阅了网络上、老师手里的资料,发现RD谱的绘制方法并不统一,有些存在一定问题。在此,将心得体会记录下来。

mddh_123的博客 3万+

Python爬虫教程:抓取社交媒体内容(以Facebook和Instagram为例)

为什么抓取社交媒体内容?品牌分析与监测:通过抓取品牌、产品或服务相关的社交媒体数据,可以获得公众对其的评价,识别市场趋势,制定营销策略。情感分析:分析用户在社交平台上的情感倾向,如对某事件、产品、服务的正面或负面情绪。舆情监控:通过抓取大量社交媒体内容,监测公众对热点事件的反应,发现潜在的社会问题。用户行为分析社交媒体的数据类型:帖子和内容:包括用户发布的文本、图片、视频等。用户互动用户信息:包括用户名、粉丝数、关注数等社交信息。社交媒体的反爬虫机制:API限制。

2201_76125261的博客 1337

数据结构和算法(5):二叉树

数据结构学习笔记

学习记录 942

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数据结构 | 二叉树

7.21 今天真的得学这个专题了,没跑了

Leonadoice的博客 279

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构与算法基础(青岛大学——王卓) note

数据结构第一章:绪论逻辑结构逻辑结构的种类存储结构存储结构的种类逻辑结构与存储结构的关系 第一章:绪论 数据:分为数值型数据与非数值型数据 是能输入计算机且能被计算机处理的各种符号的集合 数据元素:数据的基本单位 数据元素也叫记录、结点、顶点 数据项:构成数据元素的不可分割的最小单位 数据 > 数据元素 > 数据项 数据对象:性质相同的数据元素的集合 数据元素与数据的关系:是集合的个体 数据项与数据的关系:是集合的子集 数据结构:相互之间存在一种或多种特定关系的数据元素的集合

weixin_51252109的博客 6762

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数据结构:树和二叉树

树和二叉树 树的定义和基本语句 二叉树 遍历二叉树和线索二叉树 树和森林 霍夫曼树及其应用 树的定义和基本语句 树是n个结点的有限集 树的表示方法 基本术语 根:即根节点(没有前驱) 叶子结点:即终端节点(没有后继) 森林:是有n棵树的集合 树的深度:所用节点层数中的最大值 二叉树 基本特点: 节点的度小于等于2 子树有序 二叉树的性质 1,在二叉树的第i层上至多有2^(i - 1)个结点(除叶子结点外,其余子树的度都为2) 2,深度为k的二叉树至多有2^k - 1个结点(总共的节点数) 3,对于任何

qq_43728862的博客 7844

树和森林、 Huffman树

树和森林的转换 树转换为二叉树 加线:在所有兄弟节点之间加一条连线;去线: 对树中每一个节点,只保留它与第一个孩子节点的连 线,删除它与其他孩子节点之间的连线。层次调整:以树的根节点为轴心,将整个树顺时针旋转一定的 角度,使之结构层次分明。 森林转换为二叉树 把每棵树转换为二叉树;第一棵二叉树不动,从第二课二叉树开始,依次把后一课二叉树的根节点作为 前一棵二叉树的根节点的右孩子,用线连接起来。当所有的二叉树连接起来就得到了由森林转换来的二 叉树。 二叉树转换为树 加线:若某节点的

serase的博客 754

数据结构(C语言版) 第 五 章 树与二叉树 知识梳理 + 作业习题详解

目录树和二叉树一.树2.有序树和无序树3.森林4.树的基本性质 本系列博客为《数据结构》(C语言版)的学习笔记(上课笔记),仅用于学习交流和自我复习 数据结构合集链接: 《数据结构》C语言版(严蔚敏版) 全书知识梳理(超详细清晰易懂) 树和二叉树 一.树 树:是N(N≥0)个结点的有限集合,N=0时,称为空树,这是一种特殊情况。在任意一棵非空树中应满足: 有且仅有一个特定的称为根的结点。 当N>1时,其余结点可分为m(m>0)个互不相交的有限集合T1,T2,…,Tm,其中每一个集合本身

繁凡さん的博客 2万+

数据结构进阶 第六章 树与二叉树

二叉树不是度为2的树:二叉树是有序树,左右子树有区别每个结点最多有两个孩子二叉树是有序树Huffman树是WPL最短的树前缀码:任意一个编码都不是其他编码的前缀Huffman编码是最优前缀码编码规则:在Huffman树上按左0右1或左1右0的规则进行编码二叉树性质(推广到树)与存储(顺序、链式)二叉树遍历算法(递归、非递归)线索二叉树(线索化、找前驱后继)二叉树与树、森林的转化哈夫曼树(二叉、k叉)并查集。

qq_75027857的博客 983

数据结构(Java)--树和二叉树

一.树      1.基础知识  树是由n(n>=0)个结点组成的有限集合。n=0的树称为空树;n>0 的树由以下两个条件约定构成 有且仅有一个结点n,它没有前驱结点,只有后继结点。n称为树的根结点 除结点n外,其余的每一个结点都有且仅有一个直接前驱结点;有零个或多个直接后继结点。 一颗大树分成几个大的分枝,每个大分枝也都是一棵树,由此我们可以给出树的递归定义。 树是由n个结点组成的有

雨ゆこ 506

数据结构——树和森林

文章目录定义树的存储结构树、森林与二叉树相互转换树的遍历Huffman树二叉编码树Huffman编码参考 定义 树是由一个集合以及在该集合上定义的一种关系构成的。集合中元素成为树的结点,所定义的关系称为父子关系。当集合为空时,是一棵空树;当集合非空时,此时有且仅有一个特定的称为根的结点。 如下图所示,a是一棵空树,b是只有一个根节点的树,c是一棵有10个结点,并且高度为2的树。 森林是m棵互不相交的树的集合。对树中的每个结点而言,其子树的集合即为森林。删去一棵树的根,就得到一个森林。反之,加上一个

zhangzhang_one的博客 6031
上一篇: PC实用小工具推荐
下一篇: WebRTC web录音权限获取与使用(遇到的问题记录)
Magicapprentice
博客等级 码龄12年 111粉丝 42原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值