给定n个权值的集合W={w1,w2,….wn}

1.在W中选取两个最小的权作为兄弟结点,以它们的权值之和作为其父结点,得到一棵新树;

2.在W中删除上述已选取的权值,以它们的权值之和作为新的权值加入W中;

3.在已构造的二叉树中重复①、②,直至W中只含有一个权重值,这棵二叉树就是所要建立的哈夫曼树(构造出有n个叶结点,叶结点相应的权值为w1,w2…wn的一棵树)

假定仍采用图6-11中的四个带权叶子结点来构造一棵哈夫曼树,按照上述算法,则构造过程如图6-12所示,其中图6-12(d)就是最后生成的哈夫曼树,它的带权路径长度为37,由此可知,图6-11(c)是由所给的4个带权叶子结点生成的一棵哈夫曼树。

构造哈夫曼的过程

在构造哈夫曼树的过程中,每次由两棵权值最小的树生成一棵新树时,新树的左子树和右子树可以任意安排,这样将会得到具有不同结构的多个哈夫曼树,但它们都具有相同的带权路径长度。为了使得到的哈夫曼树的结构尽量唯一,通常规定生成的哈夫曼树中每个结点的左子树根结点的权小于等于右子树根结点的权。上述哈夫曼树的构造过程就是遵照这一规定进行的。

(2)构造哈夫曼树的算法描述

根据上述构造哈夫曼树的过程可以写出相应的用C语言描述的算法,具体如下:

构造哈夫曼树算法

struct BTreeNode* CreateHuffman(int a[], int n) /*根据数组a中n个权值建立一棵哈夫曼树,返回树根指针*/{ int i,j; struct BTreeNode **b,*q; /*动态分配一个由b指向的指针数组*/ b=calloc(n, sizeof(struct BTreeNode*)); /*初始化b指针数组,使每个指针元素指向a数组中对应元素的结点*/ for(i=0; idata=a[i]; b[i]->left=b[i]->right=NULL; } /*进行n-1次循环建立哈夫曼树*/ for(i=1; idatadata) {k2=k1; k1=j;} else if(b[j]->datadata) k2=j; } } /*由最小权值树和次最小权值树建立一棵新树,q指向树根结点*/ q=malloc(sizeof(struct BTreeNode)); q->data=b[k1]->data+b[k2]->data; q->left=b[k1]; q->right=b[k2]; /*将指向新树的指针赋给b指针数组中k1位置,k2位置置为空*/ b[k1]=q; b[k2]=NULL; } /*删除动态建立的数组b*/ free(b); /*返回整个哈夫曼树的树根指针*/ return q;}

在这个算法中有多处动态分配存储空间,按正常情况需要判断分配是否成功,这里为简便起见而省略了。不过,由于计算机操作系统的功能越来越强,即使内存无动态分配的空间可用,系统也会自动到外存寻找空间并进行有效分配,所以通常没有必要判断动态分配是否有效。万一分配失败,也不会造成机器故障,系统会自动退出程序运行。

(3)求哈夫曼树的带权路径长度的算法描述

下面给出求哈夫曼树带权路径长度的算法。

求哈夫曼树的带权路径长度的算法

int WeightPathLength(struct BTreeNode* FBT, int len) /*根据FBT指针所指向的哈夫曼树求出带权路径长度,len初值为0*/{ if(FBT==NULL) return 0; /*空树则返回0*/ else { /*访问到叶子结点时返回该结点的带权路径长度,其中值参len保存当前被访问结点的路径长度*/ if(FBT->left==NULL && FBT->right==NULL) { return FBT->data*len; } /*访问到非叶子结点时进行递归调用,返回左、右子树的带权路径长度之和,向下深入一层时len值增1*/ else { return WeightPathLength(FBT->left,len+1)+WeightPathLength(FBT->right,len+1); } }}

最优生成树c语言_C语言:数据结构-构造哈夫曼树相关推荐

  1. c语言最优树的构造,哈夫曼树的构造及编码 Haffman树的构造及其编码

    写出构造完整的哈夫曼树的编码 void HuffmanCoding(HuffmanCode HC[], int w[], int n) // w存放n个字符的权值(均>0),构造哈夫曼树HT, ...

  2. huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码

    艾薇巴蒂!许久不见甚是想念,想必这"涨姿势"的时刻大家已经期待许久了!今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码 构造哈夫曼树 首先,我们需要了解哈夫曼树是什么: 相关知 ...

  3. 赫夫曼编码c语言 排序部分,c语言构造哈夫曼树输出哈夫曼编码出错 ,跪求大神帮我找错...

    c语言构造哈夫曼树输出哈夫曼编码出错 ,跪求大神帮我找错0 youxun0952016.09.07浏览120次分享举报 #include #include #include typedef struc ...

  4. 【数据结构】赫夫曼树

    数据结构赫夫曼树 /*名称:赫夫曼树语言:数据结构C语言版 编译环境:VC++ 6.0日期: 2014-3-26 */#include <stdio.h> #include <lim ...

  5. 数据结构“基于哈夫曼树的数据压缩算法”的实验报告

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com Last edited: 2022.11.20 目录 数据结构& ...

  6. 数据结构(哈夫曼树+KMP)之 数据加密+解密

    数据结构(哈夫曼树+KMP)之 数据加密+解密 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define N 1 ...

  7. 2020-10-1 //严蔚敏《数据结构》 //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码

    //严蔚敏<数据结构> //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码 //(从叶子结点到根逆向求每个字符的赫夫曼编码)以及(无栈非递归遍历赫夫曼树,求赫夫曼编码) //自学中 ...

  8. 数据结构 基于哈夫曼树的数据压缩算法

    数据结构 基于哈夫曼树的数据压缩算法 实验目的 实验内容 实验提示 实验代码 实验小结 实验目的 1.掌握哈夫曼树的构造算法. 2.掌握哈夫曼编码的构造算法. 实验内容 问题描述 输入一串字符串,根据 ...

  9. 【数据结构】哈夫曼树与哈夫曼编码

    定义 带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值wkw_kwk​,从根节点到每个叶子结点的长度为lkl_klk​,则每个叶子结点的带权路径长度之和就是:WPLWPLWPL=∑ ...

最新文章

  1. Servlet RequestDispatcher需要注意的情况
  2. C++学习之路: 单例模板
  3. 复习日记-validate表单校验插件/菜单管理dTree
  4. 分享在MVC3.0中使用jQuery DataTable 插件
  5. android 16进制 全透明_你有几种实现方案Android 设备唯一标识?
  6. Java之for和while的内容
  7. Spring RCE 漏洞 CVE-2022-22965 的终极解决方案
  8. ubuntu 安装 最新 PyMOL [源码安装][免费]
  9. matplotlib plot 绘图函数发生阻塞(block)时的解决方法
  10. GitHub冲突解决
  11. ConceptDraw Office for mac(跨平台图表办公程序)
  12. c语言 自适应模式算术编码,算术压缩论文基于算术编码的数据压缩算法研究与实现.doc...
  13. 【Python】py3.6请求网站时报错:http.client.RemoteDisconnected: Remote end closed connection without response
  14. 判断一个数是不是质数(素数)
  15. 种草平台--持续更新
  16. python求小于n的最大素数_小于或等于n的素数
  17. c语言 gets getc,6.16 C语言,getchar gets getc有什么区别 分别是表示什么的
  18. Python-随机生成20位数字
  19. matlab 数学建模 一阶常微分方程ode45
  20. 3、关于手机型号的前缀翻译表

热门文章

  1. axios post object object_一套全面又有实际意义的axios封装+api管理方案
  2. 机器学习之详解Logistic回归
  3. 软考网络工程师看图题题目(含答案)
  4. MT6739芯片处理器,MT6739套片开发资料汇集下载
  5. C语言:一维数组名作函数参数
  6. 老大易主,汽车互联网行业格局变了
  7. leetcode_650. 2 Keys Keyboard_dp
  8. 耳机专用升压芯片 3.3V同步升压IC 代替ME2188升压芯片高频1MHZ
  9. 在EXCEL表格中如何进行排序(如按照成绩总分排名)
  10. touch 命令的使用详解