首页 > 其他分享 >【数据结构】哈夫曼树

【数据结构】哈夫曼树

时间:2024-12-08 09:01:37浏览次数:5  
标签:编码 结点 哈夫曼 HT 二叉树 权值 数据结构

哈夫曼树

路径长度:从树中一个结点到另一个结点之间的分支构成这两个节点之间的路径,路径上的分支数目称为路径长度

树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记为WPL= ∑ k = 1 n w k l k \sum^{n}_{k=1}w_kl_k ∑k=1n​wk​lk​

带权路径长度最小的二叉树称为最优二叉树哈夫曼树

注意

哈夫曼树不一定是完全二叉树

书中一定没有度为1的结点

树中权值最小的两个结点一定是兄弟

包含n个叶子节点的哈夫曼树共有2n-1个结点

包含n棵树的森林要经过n-1次合并才能形成哈夫曼树,共形成n-1个新结点,且度为2

树中任意非叶子节点的权值一定不小于下一层任意结点的权值

哈夫曼树的构造

哈夫曼算法:

  1. 根据给定的权值构成n棵二叉树的森林,每棵树只有一个带权为wi的根节点
  2. 在森林中选取两棵根节点权值最小的树作为左右子树,构造一棵新的二叉树,且设置新的二叉树的根节点的权值为其左右子树的权值和
  3. 在森林中删除这两棵树,同时将新得到的二叉树加入森林中
  4. 重复(2)(3),直到森林中只有一棵树为止,这棵树即为哈夫曼树(重复第二步时不一定选用新树)

哈夫曼树的实现

采用顺序存储结构

typedef struct{
    int weight;
    int parent,lch,rch;
}HTNode,*HTree;
void CreateHuffmanTree(HuffmanTree HT,int n){
    if(n<=1)
        return;
    m=2*n-1;//数组共2n-1个元素
    HT=new HTNode[m+1];//0号单元未用,HT[m]表示根节点
    for(i=1;i<=m;i++){	//将2n-1个元素的lch、rch、parent置为0
        HT[i].lch=0;
        HT[i].rch=0;
        HT[i].parent=0;
    }
    for(i=1;i<=n;++i)
        cin>>HT[i].weight;//输入前n个元素的weight值
    //初始化结束,下面开始建立哈夫曼树
    for(i=n+1;i<=m;i++){	//合并产生n-1个结点——构造Huffman树
        Select(HT,i-1,s1,s2);//在HT[k]中选择两个双亲域为0,且权值最小的结点,并返回它们在HT中的序号s1和s2
        HT[s1].parent=i;
        HT[s2].parent=i;	//表示从F中删除s1、s2
        HT[i].lch=s1;	
        HT[i].rch=s2;	//s1,s2分别作为i的左右孩子
        HT[i].weight=HT[s1].weight+HT[s2].weight;//i的权值为左右孩子权值之和
    }
}

哈夫曼编码

将编码设计为不等长的二进制编码,让代传字符中出现次数较多的字符采用较短的编码

前缀编码:任一个字符的编码都不是另一个字符的字符的编码的前缀

构造哈夫曼编码:

  1. 将字符出现的频率作为权值,构建哈夫曼树
  2. 从根节点出发,左分支标记0,右分支标记1
  3. 从根节点出发,到叶子节点,路过的所有分支的编码组合起来,就是哈夫曼编码

标签:编码,结点,哈夫曼,HT,二叉树,权值,数据结构
From: https://blog.csdn.net/lhr056813/article/details/144319267

相关文章

  • 数据结构 (31)插入类排序
    前言     数据结构中的插入类排序是一种简单直观的排序算法,其核心思想是通过构建有序序列,将未排序的数据逐个插入到已排序的序列中,直到所有元素都排序完毕。一、基本思想    插入排序的基本思想是将数组分为已排序和未排序两部分,初始时,已排序部分只包含一......
  • 数据结构 (32)交换类排序
    前言     交换排序是一类基于比较和交换元素位置的排序算法。其核心思想是通过两两比较待排元素的关键字(或称为key值),若发现与排序要求相逆(即逆序),则交换这两个元素的位置,直到所有元素都排序完毕。一、冒泡排序(BubbleSort)基本思想:通过反复比较相邻的元素,根据......
  • 数据结构小白一小时手搓环形缓冲区
    什么是环形缓冲区环形缓冲区是一种非常高效且常用的数据结构,特别适用于需要处理数据流的场景。它通过循环利用固定大小的内存空间来实现数据的缓存和传输,避免了频繁的内存分配和释放,提高了系统性能和实时性。理解其工作原理和优缺点,可以帮助开发者更好地选择和使用这种数据......
  • 数据结构题库12
    第六章图一、单项选择题1.下面关于图的存储结构的叙述中正确的是(1)。(1):A.用邻接矩阵存储图占用空间大小只与图中顶点有关,与边数无关B.用邻接矩阵存储图占用空间大小只与图中边数有关,而与顶点数无关C.用邻接表存储图占用空间大小只与图中顶点数有关,而与边数无关D.用邻......
  • 数据结构题库13
    第七章查找一、单项选择题1.在长度为n的线性表中进行顺序查找,在等概率的情况下,查找成功的平均查找长度是(1)。(1):A.nB.n(n+1)/2C.(n-1)/2D.(n+1)/22.在长度为n的顺序表中进行顺序查找,查找失败时需与键值比较次数是(2)。(2):A.nB.1C.n-1D.n+l3.对线性表进行顺序查找时,要求......
  • 【数据结构】树、堆的概念和代码实现
    引言        树,就像一个家族族谱,家族中的老祖宗是根节点,他的子女们是根节点的子树,每个子女又能繁衍自己的后代形成更小的子树分支。又似公司的组织架构,总经理是根节点,部门经理是其下的分支节点,普通员工则是叶子节点,各层级相互关联,不同类型的树如二叉树就像只有左右两......
  • 数据结构的概念、堆栈
    数据结构与算法数据结构研究程序里如何使用存储区存放数字,算法研究解决一些常见问题的通用方法。数字之间的关系可以从两个完全不同的角度描述。逻辑关系(逻辑结构)描述数字之间与计算机无关的关系;物理关系(物理结构)描述存放数字的存储区之间的关系。逻辑结构1.集合结构:所有的数......
  • 数据结构6.1--插入排序
    目录1.基本思想1.2直接插入排序1.3希尔排序(缩小增量排序)1.基本思想直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。实际中我们玩扑克牌,就用......
  • 数据结构5——二叉树
    走上计算机的道路,疲惫和无力会不断向你袭来。虽途艰路险,然功成之日,往昔困厄皆为序章,亦足慰心怀,堪称圆满。目录1.树概念及结构1.1树的概念1.2树的相关概念1.3树的表示1.4树在实际中的运用(表示文件系统的目录树结构)2.二叉树概念及结构2.1概念2.2现实中的二叉树2.3特......
  • 数据结构-八大排序
    插入排序时间复杂度为\(O(n^2)\)//插入排序(下标从1开始存放元素)(王道数据结构)voidInsertSort(inta[],intn){ inti,j; for(i=2;i<=n;i++){ if(a[i]<a[i-1]){ a[0]=a[i];//数组首位位缓存区,也就是哨兵 for(j=i-1;a[0]<a[j];j......