定义:最优树,带权路径长度最短的树

基本概念:

1:路径长度:从树的一个结点到另一个结点的路径中,路径上的分支数目为路径长度
2:树的路径长度:从结点到每个结点的路径长度之和
3:树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之 简单来说:每个(叶子结点的权)(根到该叶子结点的分支数)之和
4:最优二叉树(哈夫曼树):WPL最小的树
5:一个有n个叶子结点的哈夫曼树共有2
n-1个结点
6:哈夫曼树性质:没有度为1的结点;两个权值最小的结点一定是兄弟结点;哈夫曼树并非一棵完全二叉树
7:哈夫曼编码:在构建的哈夫曼树中,根据左分支(树茎)为0,右分支为1的规则,从根到某个叶子结点分别编码,最后得到该叶子结点的哈夫曼编码。
8:前缀编码:任意一个字符编码都不是另外一个字符编码的前缀
9:在哈夫曼编码中,若编码长度只允许<=4,则出来已知的两个字符编码为0和10外,还可以最多对(4)字符进行编码
解:由长度限制 故而知树度最高为5,由0和10编码 可知第二层和第三层只有一个叶子结点(‘0’,‘10’)故而知第四层有俩父结点和第五层分别有四个叶子结点(位置)
如图:
哈夫曼编码和哈夫曼树:
有些代码是参考(白嫖)某个博主(忘了是哪个)和书
思想:从n个数据中选取2个值最小的结点,合成(相加)为一个结点,把新结点扔回那批数据(刚刚那2个结点不参与下次运算),重复以上操作

typedef struct{unsigned int weigth;unsigned int parent,lchild,rchild;
}HTNode,*HuffumanTree;
typedef char** HuffmanCode;void myHuffmanCoding(int *w ,int n)//W存放n个字符的权值
{int m=2*n-1,i,j;//存放总结点树 int *w1=w;int s1,s2;char cd[n];//编码 HTNode HT[m+1];HuffmanTree p;p=(HuffmanTree)malloc(sizeof(HTNode)*(m+1));if (n<=1) return Error;//权值分配for(p=&HT[1],i=1;i<=n;++i,++p,++w1) p->weight=*w1,p->parent=0,p->lchild=0,p->rchild=0;//对叶子结点的父节点进行权值分配 for(;i<=m;++i,++p) p->weight=0,p->parent=0,p->lchild=0,p->rchild=0;for(i=n+1;i<=m;i++){Select(HT,i-1,&s1,&s2);//在0到i-1挑选“最小”的俩个HT[s1].parent=i,HT[s2].parent=i;//i属于(n+1,m)  小蝌蚪认妈妈ingHT[i].lchild=s1,HT[i].rchild=s2;//左右孩子的坐标   妈妈认小蝌蚪ingHT[i].weight=HT[s1].weight+HT[s2].weight; }printf("认亲test\n");char HC[n+1][n];for(i=1;i<=n;++i){//逐个字符求霍夫曼编码 cd[n-1]='\0';//编码结束符号int end=n-1,c,f;for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent){if(HT[f].lchild==c) cd[--end]='0';//左0右1的原则else cd[--end]='1';}//c=i,f=HT[i].parent  HT[f].lchild==c 确定血缘关系strcpy(HC[i],&cd[end]);} for(j=1;j<=n;j++){printf("%d-->",w[j-1]);printf("%s",HC[j]);printf("\n");}} void Select(HTNode HT[],int n,int *s1,int *s2)
{int min1=10000,min2=10000;int i=0;int j;for(i=1;i<=n;i++){if(HT[i].weight<min1&&HT[i].parent==0){min1=( HT[i].weight );*s1=i;}}HT[*s1].parent=1;//找到最小的  使父节点不为0 for(i=1;i<=n;i++){if(HT[i].weight<min2&&HT[i].parent==0){min2=( HT[i].weight );*s2=i;}}HT[*s2].parent=1;//if(*s1>*s2){j=*s1;*s1=*s2;*s2=j;}
}void Huffumancode(){int i,n;//几个数printf("一共几字符:");scanf("%d",&n);int a[n];for(i=0;i<n;i++){scanf("%d",&a[i]);} int *w=&a[0];///权值myHuffmanCoding(w,n); }

WPL、最优二叉树(哈夫曼树)相关推荐

  1. 最优二叉树——哈夫曼树

      一:什么是最优二叉树? 从我个人理解来说,最优二叉树就是从已给出的目标带权结点(单独的结点) 经过一种方式的组合形成一棵树.使树的权值最小. 最优二叉树是带权路径长度最短的二叉树.根据结点的个数, ...

  2. 6.6.1最优二叉树(赫夫曼树)

    首先我们来看一个伪代码.这个是代表成绩的等级. 然后我们知道,每一次高考,学生的成绩分布应该接近某个比例,现在我们假如分别规律如下: 为此可以作出下面的这个树. 我们发现,概率分布主要是在70-79, ...

  3. 算法学习之最优二叉树(赫夫曼树)

    概念 给定n个权值作为n个叶子节点,构造一颗二叉树,若该数的代全路径长度(wpl)达到最小,称这样的的二叉树为最优二叉树,也成霍夫曼树 霍夫曼树是带权路径长度最短的树,权值较大的节点离根较近 路径和路 ...

  4. 最优二叉树-哈夫曼树

    关于最优二叉树, 一开始看书 , 做题 还是蒙的 后来多做几题大致就懂得了 , 百度百科给出的官方定义: 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最 ...

  5. 最优二叉树(赫夫曼树)

    赫夫曼树的介绍(写的不好地方大佬请指教) 最优二叉树又称哈夫曼树,是带权路径最短的二叉树.根据节点的个数,权值的不同,最优二叉树的形状也不同. 图 6-34 是 3 棵最优二叉树的例子,它们共同的特点 ...

  6. 最优二叉树(哈夫曼树)

    哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 哈夫曼树的特点 哈夫曼编码 哈夫曼树的定义 例如: 哈夫曼树就是要构造一棵WPL最小的二叉树. 哈夫曼树的构造 哈夫曼树构造时,每次把权值最小的两颗二叉树合并 ...

  7. 最有二叉树 哈夫曼树

    最优二叉树 1.树的路径长度     树的路径长度是从树根到树中每一结点的路径长度之和.在结点数目相同的二叉树中,完全二叉树的路径长度最短. 2.树的带权路径长度(Weighted Path Leng ...

  8. 理论基础 —— 二叉树 —— 哈夫曼树与哈夫曼编码

    [哈夫曼树] 1.相关概念 1)叶结点的权值:对叶结点赋予的一个有意义的数值量 2)二叉树的带权路径长度(WPL):设二叉树具有 n 个带权叶结点,从根结点到各叶结点的路径长度与相应叶节点权值的乘积之 ...

  9. 【id:180】【20分】D. DS二叉树--赫夫曼树解码(不含代码框架)

    题目描述 已知赫夫曼编码算法和程序,在此基础上进行赫夫曼解码 在赫夫曼树的类定义中增加了一个公有方法: int  Decode(const string codestr, char txtstr[]) ...

  10. 【id:179】【20分】C. DS二叉树--赫夫曼树的构建与编码(不含代码框架)

    题目描述 给定n个权值,根据这些权值构造huffman树,并进行huffman编码 参考课本P147算法6.12 HuffmanCoding代码,注意数组访问是从位置1开始 要求:赫夫曼的构建中,默认 ...

最新文章

  1. 使用Flying-Saucer生成PDF中的条形码
  2. jQuery触发a标签的点击事件无效
  3. idea 关联jdk源码_[项目源码]ERP进销存系统
  4. 极速体验:Oracle 18c 下载和Scalable Sequence新特性
  5. JVM各个组成部分和其基本功能
  6. 数据增强_NLP 数据增强方法 EDA
  7. 是否可以在git中预览藏匿内容?
  8. pycharm小技巧
  9. 视频消除人声,适用于配音比赛等场合
  10. 【仅供学习研究】网站复制工具+整站镜像克隆工具
  11. 学电脑PHP,如何学电脑
  12. 杰理之ANC降噪基本原理【篇】
  13. 超平面与半空间Euclid 球和椭球 超平面分离定理和 支撑超平面定理
  14. 互联网时代创业推荐三本书
  15. oracle中索引的使用
  16. 关于软件工程课程的学习计划
  17. 怎么在电脑找到菜单android,在打开的开始菜单中找到我的电脑(计算机)
  18. 钰泰ETA9030蓝牙耳机充电仓双向通讯,带NTC
  19. 帝国时代2高清版秘籍
  20. 如何获取Java,JDK源码

热门文章

  1. 论文解读:Few-shot Slot Tagging with Collapsed Dependency Transfer and Label-enhanced Task-adaptive Proje
  2. 《设计模式之禅》之六大设计原则
  3. 计算机毕业设计ssm缺陷管理系统d6ltf系统+程序+源码+lw+远程部署
  4. 基于二叉查找树的图书影碟租赁管理系统c#实现(控制台)
  5. win10系统找不到以太网该怎么办
  6. 量子计算机 郭光灿,郭光灿(中国科学院院士、量子信息学家)_百度百科
  7. k8s network policy配置,看这篇就够了
  8. idea 编写ATM取款机
  9. 日本語:日常会话9-居酒屋へ見に行こう
  10. 2014互联网百强企业出炉 八爪鱼排名99