哈夫曼树的基本构建与操作

【数据结构基础】树 - 哈夫曼树(Huffman Tree) 路径与路径长度: 从树中一个节点到另一个节点之间的分支构成了两个节点之间的路径,路径上的分支数目称作路径长度。树的带权路径长度: 树的带权路径长度为所有叶子节点的带权路径长度之和,称为WPL。在森林中选出根结点的权值最小的两棵树进行合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;从根节点到每一个叶子节点的路径上,左分支记为0,右分支记为1,将这些0与1连起来即为叶子节点的哈夫曼编码。节点的权: 将树中的节点赋予一个某种含义的数值作为该节点的权值,该值称为节点的权; 阅读详情
AI摘要

本文详细介绍了哈夫曼树的基本概念、构造方法及其在压缩编码中的应用,通过具体实例展示了哈夫曼编码的过程。

看到的讲解huffman树的一篇比较好懂的博客

出处:http://blog.youkuaiyun.com/wtfmonking/article/details/17150499#

1、基本概念


a、路径和路径长度

若在一棵树中存在着一个结点序列 k1,k2,……,kj, 使得 ki是ki+1 的双亲(1<=i<j),则称此结点序列是从 k1 到 kj 的路径。

从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它等于路径上的结点数减1.


b、结点的权和带权路径长度

在许多应用中,常常将树中的结点赋予一个有着某种意义的实数,我们称此实数为该结点的权,(如下面一个树中的蓝色数字表示结点的权)

结点的带权路径长度规定为从树根结点到该结点之间的路径长度与该结点上权的乘积。


c、树的带权路径长度

树的带权路径长度定义为树中所有叶子结点的带权路径长度之和,公式为:


其中,n表示叶子结点的数目,wi 和 li 分别表示叶子结点 ki 的权值和树根结点到 ki 之间的路径长度。

如下图中树的带权路径长度 WPL = 9 x 2 + 12 x 2 + 15 x 2 + 6 x 3 + 3 x 4 + 5 x 4  =  122



d、哈夫曼树

哈夫曼树又称最优二叉树。它是 n 个带权叶子结点构成的所有二叉树中,带权路径长度 WPL 最小的二叉树。

如下图为一哈夫曼树示意图。


2、构造哈夫曼树


假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:


(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);


(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;


(3)从森林中删除选取的两棵树,并将新树加入森林;


(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。


 如:对 下图中的六个带权叶子结点来构造一棵哈夫曼树,步骤如下:


注意:为了使得到的哈夫曼树的结构尽量唯一,通常规定生成的哈夫曼树中每个结点的左子树根结点的权小于等于右子树根结点的权。


具体算法如下:

  1. //2、根据数组 a 中 n 个权值建立一棵哈夫曼树,返回树根指针  
  2. struct BTreeNode* CreateHuffman(ElemType a[], int n)  
  3. {  
  4.     int i, j;  
  5.     struct BTreeNode **b, *q;  
  6.     b = malloc(n*sizeof(struct BTreeNode));  
  7.     for (i = 0; i < n; i++) //初始化b指针数组,使每个指针元素指向a数组中对应的元素结点  
  8.     {  
  9.         b[i] = malloc(sizeof(struct BTreeNode));  
  10.         b[i]->data = a[i];  
  11.         b[i]->left = b[i]->right = NULL;  
  12.     }  
  13.     for (i = 1; i < n; i++)//进行 n-1 次循环建立哈夫曼树  
  14.     {  
  15.         //k1表示森林中具有最小权值的树根结点的下标,k2为次最小的下标  
  16.         int k1 = -1, k2;  
  17.         for (j = 0; j < n; j++)//让k1初始指向森林中第一棵树,k2指向第二棵  
  18.         {  
  19.             if (b[j] != NULL && k1 == -1)  
  20.             {  
  21.                 k1 = j;  
  22.                 continue;  
  23.             }  
  24.             if (b[j] != NULL)  
  25.             {  
  26.                 k2 = j;  
  27.                 break;  
  28.             }  
  29.         }  
  30.         for (j = k2; j < n; j++)//从当前森林中求出最小权值树和次最小  
  31.         {  
  32.             if (b[j] != NULL)  
  33.             {  
  34.                 if (b[j]->data < b[k1]->data)  
  35.                 {  
  36.                     k2 = k1;  
  37.                     k1 = j;  
  38.                 }  
  39.                 else if (b[j]->data < b[k2]->data)  
  40.                     k2 = j;  
  41.             }  
  42.         }  
  43.         //由最小权值树和次最小权值树建立一棵新树,q指向树根结点  
  44.         q = malloc(sizeof(struct BTreeNode));  
  45.         q->data = b[k1]->data + b[k2]->data;  
  46.         q->left = b[k1];  
  47.         q->right = b[k2];  
  48.   
  49.         b[k1] = q;//将指向新树的指针赋给b指针数组中k1位置  
  50.         b[k2] = NULL;//k2位置为空  
  51.     }  
  52.     free(b); //删除动态建立的数组b  
  53.     return q; //返回整个哈夫曼树的树根指针  
  54. }  

3、哈夫曼编码

在电报通信中,电文是以二进制的0、1序列传送的,每个字符对应一个二进制编码,为了缩短电文的总长度,采用不等长编码方式,构造哈夫曼树,

将每个字符的出现频率作为字符结点的权值赋予叶子结点,每个分支结点的左右分支分别用0和1编码,从树根结点到每个叶子结点的路径上

所经分支的0、1编码序列等于该叶子结点的二进制编码。如上文所示的哈夫曼编码如下:

a 的编码为:00

b 的编码为:01

c 的编码为:100

d 的编码为:1010

e 的编码为:1011

f 的编码为:11


4、哈夫曼树的操作运算


以上文的哈夫曼树作为具体实例,用详细的程序展示哈夫曼树的操作运算

  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. typedef int ElemType;  
  4. struct BTreeNode  
  5. {  
  6.     ElemType data;  
  7.     struct BTreeNode* left;  
  8.     struct BTreeNode* right;  
  9. };  
  10.   
  11. //1、输出二叉树,可在前序遍历的基础上修改。采用广义表格式,元素类型为int  
  12. void PrintBTree_int(struct BTreeNode* BT)  
  13. {  
  14.     if (BT != NULL)  
  15.     {  
  16.         printf("%d", BT->data); //输出根结点的值  
  17.         if (BT->left != NULL || BT->right != NULL)  
  18.         {  
  19.             printf("(");  
  20.             PrintBTree_int(BT->left); //输出左子树  
  21.             if (BT->right != NULL)  
  22.                 printf(",");  
  23.             PrintBTree_int(BT->right); //输出右子树  
  24.             printf(")");  
  25.         }  
  26.     }  
  27. }  
  28.   
  29. //2、根据数组 a 中 n 个权值建立一棵哈夫曼树,返回树根指针  
  30. struct BTreeNode* CreateHuffman(ElemType a[], int n)  
  31. {  
  32.     int i, j;  
  33.     struct BTreeNode **b, *q;  
  34.     b = malloc(n*sizeof(struct BTreeNode));  
  35.     for (i = 0; i < n; i++) //初始化b指针数组,使每个指针元素指向a数组中对应的元素结点  
  36.     {  
  37.         b[i] = malloc(sizeof(struct BTreeNode));  
  38.         b[i]->data = a[i];  
  39.         b[i]->left = b[i]->right = NULL;  
  40.     }  
  41.     for (i = 1; i < n; i++)//进行 n-1 次循环建立哈夫曼树  
  42.     {  
  43.         //k1表示森林中具有最小权值的树根结点的下标,k2为次最小的下标  
  44.         int k1 = -1, k2;  
  45.         for (j = 0; j < n; j++)//让k1初始指向森林中第一棵树,k2指向第二棵  
  46.         {  
  47.             if (b[j] != NULL && k1 == -1)  
  48.             {  
  49.                 k1 = j;  
  50.                 continue;  
  51.             }  
  52.             if (b[j] != NULL)  
  53.             {  
  54.                 k2 = j;  
  55.                 break;  
  56.             }  
  57.         }  
  58.         for (j = k2; j < n; j++)//从当前森林中求出最小权值树和次最小  
  59.         {  
  60.             if (b[j] != NULL)  
  61.             {  
  62.                 if (b[j]->data < b[k1]->data)  
  63.                 {  
  64.                     k2 = k1;  
  65.                     k1 = j;  
  66.                 }  
  67.                 else if (b[j]->data < b[k2]->data)  
  68.                     k2 = j;  
  69.             }  
  70.         }  
  71.         //由最小权值树和次最小权值树建立一棵新树,q指向树根结点  
  72.         q = malloc(sizeof(struct BTreeNode));  
  73.         q->data = b[k1]->data + b[k2]->data;  
  74.         q->left = b[k1];  
  75.         q->right = b[k2];  
  76.   
  77.         b[k1] = q;//将指向新树的指针赋给b指针数组中k1位置  
  78.         b[k2] = NULL;//k2位置为空  
  79.     }  
  80.     free(b); //删除动态建立的数组b  
  81.     return q; //返回整个哈夫曼树的树根指针  
  82. }  
  83.   
  84. //3、求哈夫曼树的带权路径长度  
  85. ElemType WeightPathLength(struct BTreeNode* FBT, int len)//len初始为0  
  86. {  
  87.     if (FBT == NULL) //空树返回0  
  88.         return 0;  
  89.     else  
  90.     {  
  91.         if (FBT->left == NULL && FBT->right == NULL)//访问到叶子结点  
  92.             return FBT->data * len;  
  93.         else //访问到非叶子结点,进行递归调用,返回左右子树的带权路径长度之和,len递增  
  94.             return WeightPathLength(FBT->left,len+1)+WeightPathLength(FBT->right,len+1);  
  95.     }  
  96. }  
  97.   
  98. //4、哈夫曼编码(可以根据哈夫曼树带权路径长度的算法基础上进行修改)  
  99. void HuffManCoding(struct BTreeNode* FBT, int len)//len初始值为0  
  100. {  
  101.     static int a[10];//定义静态数组a,保存每个叶子的编码,数组长度至少是树深度减一  
  102.     if (FBT != NULL)//访问到叶子结点时输出其保存在数组a中的0和1序列编码  
  103.     {  
  104.         if (FBT->left == NULL && FBT->right == NULL)  
  105.         {  
  106.             int i;  
  107.             printf("结点权值为%d的编码:", FBT->data);  
  108.             for (i = 0; i < len; i++)  
  109.                 printf("%d", a[i]);  
  110.             printf("\n");  
  111.         }  
  112.         else//访问到非叶子结点时分别向左右子树递归调用,并把分支上的0、1编码保存到数组a  
  113.         {   //的对应元素中,向下深入一层时len值增1  
  114.             a[len] = 0;  
  115.             HuffManCoding(FBT->left, len + 1);  
  116.             a[len] = 1;  
  117.             HuffManCoding(FBT->right, len + 1);  
  118.         }  
  119.     }  
  120. }  
  121.   
  122. //主函数  
  123. void main()  
  124. {  
  125.     int n, i;  
  126.     ElemType* a;  
  127.     struct BTreeNode* fbt;  
  128.     printf("从键盘输入待构造的哈夫曼树中带权叶子结点数n:");  
  129.     while(1)  
  130.     {  
  131.         scanf("%d", &n);  
  132.         if (n > 1)  
  133.             break;  
  134.         else  
  135.             printf("重输n值:");  
  136.     }  
  137.     a = malloc(n*sizeof(ElemType));  
  138.     printf("从键盘输入%d个整数作为权值:", n);  
  139.     for (i = 0; i < n; i++)  
  140.         scanf(" %d", &a[i]);  
  141.     fbt = CreateHuffman(a, n);  
  142.     printf("广义表形式的哈夫曼树:");  
  143.     PrintBTree_int(fbt);  
  144.     printf("\n");  
  145.     printf("哈夫曼树的带权路径长度:");  
  146.     printf("%d\n", WeightPathLength(fbt, 0));  
  147.     printf("树中每个叶子结点的哈夫曼编码:\n");  
  148.     HuffManCoding(fbt, 0);  
  149. }  

运行结果:

最优二叉树—哈夫曼(huffman)树 哈夫曼树又称最优二叉树,是一类带权路径长度最短的二叉树,有着广泛的应用。基本概念权:将树中的结点赋上一个有着某种意义的数值路径:从A结点道B结点所经过的分支序列路径长度:从A结点道B结点所经过的分支数目查找效率平均查找长度(ASL)取决于树的高度ASL=(1+2*2+3)/4=2 ASL=(1+2+3... 阅读详情

相关推荐

哈夫曼树的构建(详解顺序结构和链式结构)

详解哈夫曼树的构建,包含顺序结构和链式结构两种方式

CXR_XC的博客 1万+

哈夫曼树原理解析,构造方法,意义和作用。

哈夫曼树(最优二叉树) 百度百科:https://baike.baidu.com/item/%E5%93%88%E5%A4%AB%E6%9B%BC%E6%A0%91/2305769?fr=aladdin 一. 目的: 找出存放一串字符所需的最少的二进制编码 二. 构造方法: 首先统计出每种字符出现的频率!(也可以是概率)//权值 ----------------------------...

Anakki的博客 30万+

Java小程序之哈夫曼树与文件压缩和解压缩(二)文件压缩篇

Java小程序之哈夫曼树与文件压缩和解压缩(二)文件压缩篇 一、初识压缩与解压缩原理 压缩可以理解为:对文件的加密过程 解压可以理解为:对文件的解密过程 例如: 我  - a 是  -  b 谁  -  c 我是谁   - 》  abc 二、压缩原理详解 我们都知道,计算机只能存储二进制数据,即计算机中存储的都是0和1;那么我们看的的a、b、c

BlueSky_USC的博客 6619

哈夫曼树(Huffman)【数据结构】

假如

m0_73065213的博客 1万+

详细解读一下哈夫曼树,并给出搜索示例代码

哈夫曼树的基本思想是将出现频率高的数据用较短的编码表示,而出现频率低的数据用较长的编码表示,从而实现数据压缩的目的。哈夫曼树的特点之一是,它是一棵最优二叉树,也就是说,对于给定的一组权值(或频率),哈夫曼树可以最小化权值的加权路径长度。以上代码中,HuffmanNode表示哈夫曼树的节点,包含一个freq表示节点的权重,一个value表示节点存储的数据,以及左右子节点left和right。从集合中找到两个权值最小的节点,并将它们合并成一个新的节点,新节点的权值为两个子节点的权值之和。

zhangzhechun的专栏 394

SFR算法实现详解:从边缘检测到MTF计算的完整流程

本文详细解析了SFR算法从边缘检测到MTF计算的完整流程,包括边缘检测、ESF超采样、LSF差分等关键步骤。通过代码示例和实战经验,帮助开发者高效实现成像系统解析力评估,优化MTF测量精度。适用于摄像头模组调试、工业检测等场景。

Black的专栏 1009

构建哈夫曼树

整体思路是:先创建一个空的树的节点,再从刚刚创建好的最小堆中,取出两个最小节点,作为这个节点的左右分支。给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。构建哈夫曼树的第一步是建立最小堆:先读取用户输入的字符与其对应的权值,并将其无序插入到堆中再根据权值,不断调整堆,使其变成为最小堆。剩下的树:3、3、4、5、6、7。1.假设一共有7个数(一个节点),其权重分别为1,2,3,4,5,6,7.

2403_89879953的博客 615

统信UOS下获取root权限的两种姿势:图形化开启开发者模式 vs 命令行直接提权

本文详细解析了统信UOS下获取root权限的两种方法:通过图形界面永久开启开发者模式和使用命令行临时提权。开发者模式适合系统级开发,提供完整root权限但降低安全性;临时提权则更灵活,适合日常管理任务。文章还对比了两种方案的优缺点,帮助用户根据需求选择最佳权限管理策略。

weixin_30266885的博客 515

哈夫曼编码与译码

最近完成了数据结构的课程设计,想着写一下博客,一是再次熟悉一下,让自己在过两天的答辩中更加行云流水,二是可以分享给大家,互相学习。本次实验的题目是:哈夫曼编码与译码。哈夫曼编码是一种可变长度且无损压缩的编码方式。在哈夫曼树中,出现频率高的字符将被编码为较短的二进制编码,而出现频率低的字符将被编码为较长的二进制编码。通过这种方式,可以有效地减少数据的存储空间。我们将哈夫曼树看成一个数组,该数组的元素是一个结构体。该结构体包含:权值、字符、左右子树。1.哈夫曼树的构建。

qq_73866060的博客 7857

网格聚类 Grid Clustering/Grid-based Clustering

本文主要简单介绍了网格聚类的基本概念,优缺点,应用场景,建模时的注意事项,评价指标,实现方法,python示例和模型参数等。

JasonH2021的博客 4827

企业微信消息推送(一)接收消息服务器URL

企业微信限制过多,公司域名所有权检验不通过。采用接收消息服务器URL的方式。使用vscode,将UTF-8 BOM文本编码改为UTF-8。配置接收消息服务器URL。

Xiaoweidumpb 1万+

哈夫曼树的构建及其编码

常见应用:压缩,最基本的压缩编码的方法,使得总体的编码长度缩短,减少不必要的空间。什么可以称为哈夫曼树?公式判断:WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln)Wi : 表示第i个叶子的节点权值Li:表示第i个叶子节点到根节点的路径长度路径长度:通俗点,就是叶子节点到根节点的线段条数带权路径WPL最小的二叉树就叫做哈夫曼树,也叫最优二叉树。哈夫曼树构建的步骤:① 给定n个权值{...

YCJLXDLB的博客 1133

保姆级教程:用+86手机号成功注册Discord的三种亲测方法(附节点选择技巧)

本文提供了三种经过验证的方法,帮助用户使用+86手机号成功注册Discord,包括号码格式调整、网络环境优化和设备组合方案。同时详细解析了'手机号无效'报错的深层原因,并附上节点选择技巧,确保注册流程顺利。

weixin_42683394的博客 1901

哈夫曼编码生成哈夫曼树

//////////////哈夫曼编码///////////////// /* //maxnode = 2*n-1 哈夫曼编码:从队列中取出权重最小的两个节点,进行构造树    将新生成的节点作为父节点     使用结构体:   Node(node1,node2,weight)   //权重边信息保存   HuffmanTree(weight,family,lchild,rchil

yingGe_0110的博客 1315

运放比较电路分析以及应用

摘要:本文介绍了基于LM321运放的同相输入型单限电压比较器电路。该电路通过运放开环工作模式实现电平判断:当输入信号Vs+>0V时输出+15V高电平,Vs+<0V时输出≈0V低电平。典型应用包括直流电压过零检测、交流信号整形、电池欠压报警和数字信号噪声过滤。电路具有结构简单(仅需1个运放和1个电阻)、成本低的优势,适用于传感器信号处理、波形转换等场景。使用时需注意参考电平调整、输出电平匹配等问题,如需抗噪声可增加正反馈电阻构成施密特触发器。该电路是运放实现简单电平逻辑的经典方案。

qq_37999850的博客 395

YOLO11-pose关键点检测:训练实战篇 | 自己数据集从labelme标注到生成yolo格式的关键点数据以及训练教程

通过本教程,我们完整地学习了如何使用YOLO11-pose进行关键点检测任务的训练。从数据标注、格式转换到模型训练和评估,每个步骤都提供了详细的代码和说明。更高的精度:随着算法改进,关键点检测的精度将进一步提高实时性能:模型优化将使实时高性能关键点检测成为可能多模态融合:结合深度信息、热成像等多模态数据提升检测能力领域自适应:模型能够更好地适应不同场景和领域希望本教程能够帮助你在自己的项目中成功应用YOLO11-pose进行关键点检测。如果你有任何问题或建议,欢迎在评论区留言讨论!

QQ_778132974的博客 739

哈夫曼树的动画演示

​​#define MAXSIZE 100 /* 存储空间初始分配量 */​/* Status是函数的类型,其值是函数结果状态代码,如OK等 */​//以字符型作为基本类型​​​//二叉树的二叉链表结点结构定义typedef struct BiTNode /* 结点结构 *//* 结点数据 *//* 左右孩子指针 */}BiTNode;​//结构体指针别名BiTree​​​​​//哈夫曼树的类型定义​//哈夫曼树的结点定义char data;//字符。

2401_85190146的博客 580

用业务语义织就企业数据之网:SAP Datasphere 的定位、架构与落地场景全解析

SAP Datasphere作为SAP业务数据云的核心组件,通过语义层整合企业内外部数据,支持实时分析与AI应用。其核心功能包括数据集成、语义建模、虚拟化与仓库能力,通过Spaces实现资源隔离,Data Builder和Business Builder分别面向技术和业务建模。该平台与SAP HANA Cloud、SAC等深度集成,支持财务统一分析、供应链可视化等典型场景,并可通过BW bridge实现传统BW资产云化迁移。Datasphere强调开放互联,能与Databricks等生态伙伴协同,为企业提供

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1362

哈夫曼树(一)基本概念与C语言实现

Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答。正在上传…重新上传取消(01) 路径和路径长度(02) 结点的权及带权路径长度(03) 树的带权路径长度 比较下面两棵树正在上传…重新上传取消上面的两棵树都是以{10, 20, 50, 100}为叶子节点的树。左边的树WPL > 右边的树的WPL。你也可以计算除

生活需要深度 2115

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

哈夫曼树与B树的笔记

1、哈夫曼树的概念当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树2、哈夫曼树相关术语路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径(在上图种,从根结点到结点 a 之间的通路就是一条路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1(上图中从根结点到结点 c 的路径长度为 3。结点的权给每一个结点赋予一个新的数值,被称为这个结点的权。

cjl_c的博客 2028

ssm框架搭建

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

java实现-数据结构之二叉树(五):哈夫曼树的初识和代码构建

数据结构之二叉树(五):哈夫曼树 基本介绍: 给定n个权值作为n个叶子节点,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。 哈夫曼树是带权路径长度最短的树,权值最大的节点离根较近。 基本术语: 路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 结点的权及带权路径长度 若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点

qq_45273552的博客 591

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

c语言构造哈夫曼树wpl,C语言实现哈夫曼树的构建

哈夫曼树(霍夫曼树)又称为最优树.1、路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。2、结点的权及带权路径长度若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。3、树的带权路径...

weixin_33925615的博客 1128

哈夫曼树

1、基本概念 a、路径和路径长度若在一棵树中存在着一个结点序列 k1,k2,……,kj, 使得 ki是ki+1 的双亲(1<=i<j),则称此结点序列是从 k1 到 kj 的路径。从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它等于路径上的结点数减1. b、结点的权和带权路径长度在许多应用中,常常将树中的结点赋予一个有着某种意义的实数,我们称此实数为该结点的权,(如下面一个树中的蓝色数

Jijiahao95的博客 563

数据结构——B树、B+树、哈夫曼树

B+树的构造类似于B树的构造但是在 **3.当一组的节点超过4个的情况下,将中间的节点提到上一层,并且原本一组分成两份。6.B+Tree 的节点上是不保存数据的,那么它保存的关键字就更多,这样一次 IO 操作,加载的关键字就更多,所以它的磁盘读写能力更强。1、B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用。7.B+的叶子节点天然就是顺序存放的。2、B+树的非叶子节点具有索引值,在内存相同的情况下,能够存放更多的key,树的高度就会越低。

2301_78125917的博客 1353

数据结构学习笔记<6> 堆与哈夫曼树与并查集

MOOC浙江大学的数据结构慕课学习记录——堆与哈夫曼树

cos的博客 786
上一篇: 二叉树非递归遍历
下一篇: 最小生成树(Prim)poj1258
UKey_
博客等级 码龄10年 258粉丝 186原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值