哈夫曼树 (100分)哈夫曼树

article/2025/8/25 9:35:17

4-1 哈夫曼树 (100分)哈夫曼树

第一行输入一个数n,表示叶结点的个数。
需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出哈夫曼树的带权路径长度(WPL)。
输入格式:
第一行输入一个数n,第二行输入n个叶结点(叶结点权值不超过1000,2<=n<=1000)。
输出格式:
在一行中输出WPL值。
输入样例:
5
1 2 2 5 9

输出样例:
37

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define OK 1
#define ERROR -1
#define OVERFLOW -2
typedef struct  
{int weigth;int parent,Ichild,rchild;/* data */
}HTnode,*HuffmanTree;
void CreateHuffmantree(HuffmanTree &HT,int n);
int CountWeigth(HuffmanTree &HT,int n) ;
int Count(HuffmanTree &HT,int i) ;//求各个叶子的路径长,递归算法,
int main()
{int n;//n为叶子节点个数cin>>n;if(n<2||n>1000)return 0;HuffmanTree HT;CreateHuffmantree(HT,n);cout<<CountWeigth(HT,n);system("pause");return 0;
}
int CountWeigth(HuffmanTree &HT,int n) 
{int wpl=0;for(int i=1;i<=n;i++){wpl=HT[i].weigth*Count(HT,i)+wpl;}return wpl;
}
int Count(HuffmanTree &HT,int i) //求各个叶子的路径长,递归算法,
{int j;if(HT[i].parent==0)return 0;else{j=HT[i].parent;       //回溯到双亲节点下标return 1+Count(HT,j);/* code */} 
}
void Select(HuffmanTree &HT,int len,int &s1,int &s2)  //从形式上看,s1和s2用地址比较好,选最小,查找操作,不改变原值
{
int i,max=1000,temp,min;//j记录下标
int k=1;
while(HT[k].parent!=0)
{k++;
}   //找双亲不为0的节点作为假设
for(i=2;i<=len;i++) //例如当第一次循环,前n个节点,叶子权值已知,选择最小的两个
{if(HT[i].weigth<HT[k].weigth &&HT[i].parent==0)k=i;
}
s1=k;
temp=HT[s1].weigth;HT[s1].weigth=max;//s1为最小,接下的s2的值>=s1,s1定义为一个大的数值,就不会被选中
k=1;
while(HT[k].parent!=0)
{k++;
}   //找双亲不为0的节点作为假设
for(i=2;i<=len;i++) //例如当第一次循环,前n个节点,叶子权值已知,选择最小的两个
{if(HT[i].weigth<HT[k].weigth &&HT[i].parent==0)k=i;
}
s2=k;
HT[s1].weigth=temp;//将s1的原值还给s1
}
void CreateHuffmantree(HuffmanTree &HT,int n)
{if (n<1) //只有一个节点时,没有意义{return ;//函数结束}int m=n*2-1;//m为节点总数,根据哈夫曼数性质HT=new HTnode[m+1];//不要0号元素,1开始, n个节点,n-1次循环,所以总共m次,因为不用0号,所以需要m+1个;for (int i = 1; i <=m; i++){HT[i].Ichild=0;/* code */HT[i].parent=0;HT[i].rchild=0; //初始化哈夫曼表}for(int j=1;j<=n;j++)//赋予叶子节点权值 //前n个,不是后面n-1个;n-1个自动求{cin>>HT[j].weigth;}int s1=0,s2=0;for(int k=n+1;k<=m;k++)//求n之后,即是n-1轮的weigth值,即向下求数{Select(HT,k-1,s1,s2);  //s1和s2都是下标,是i-1之前的已经求出和已经定义的得到的HT[s1].parent=k;HT[s2].parent=k; //合并,s1和s2的parent为iHT[k].Ichild=s1;HT[k].rchild=s2;//将i的左右孩子设置为s1,s2HT[k].weigth=HT[s1].weigth+HT[s2].weigth; //得到i的权值,通过左右孩子 }}

运行结果
在这里插入图片描述


http://chatgpt.dhexx.cn/article/UZcUkSiW.shtml

相关文章

哈夫曼树的编码和解码

哈夫曼树的作用&#xff1a;在数据通信中&#xff0c;需要将传送的文字转换成二进制的字符串&#xff0c;用0&#xff0c;1码的不同排列来表示字符。例如&#xff0c;需传送的报文为“AFTER DATA EAR ARE ART AREA”&#xff0c;这里用到的字符集为“A&#xff0c;E&#xff0c…

哈夫曼树与哈夫曼编码

哈夫曼树 给定n个权值作为n个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若带权路径长度达到最小&#xff0c;称这样的二叉树为最优二叉树&#xff0c;也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树&#xff0c;权值较大的结点离根较近。 树节点间的边…

【例题】哈夫曼树

【例1】由五个分别带权值为9&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;14的叶子结点构成的一棵哈夫曼树&#xff0c;该树的带权路径长度为_______________。 A、60 B、66 C、67 D、50 答案&#xff1a;C 解析&#xff1a; 关键点在于要学会如何构造哈夫曼树 已知有5…

哈夫曼树以及哈夫曼算法

目录 一、哈夫曼树的定义 二、哈夫曼树的特点 三、哈夫曼算法(构造哈夫曼树的方法) 四、哈夫曼树的构造过程 五、哈夫曼树构造算法的实现 一、哈夫曼树的定义 1、哈夫曼树:最优树即带权路径长度(WPL)最短的树 “带权路径长度最短”是在"度相同”的树中比较而得的结果…

哈夫曼树的绘制

数据结构之哈夫曼树绘制 本人还是一个年轻的程序猿(还是个学生)&#xff0c;请大家多多指教&#xff01; 哈夫曼树 已知权重绘制哈夫曼树 开始我的表演 Step 1. 已知权重&#xff1a;2&#xff0c;3&#xff0c;3&#xff0c;4&#xff0c;7&#xff0c;6 Step 2. 选取其中…

哈夫曼树 哈夫曼编码

哈夫曼树 哈夫曼树的定义&#xff1a;设二叉树具有 n 个带权值的叶节点&#xff0c;那么从根节点到各个叶节点的路径长度与相应叶节点权值的乘积的和&#xff0c;叫作二叉树的带权路径长度 WPL (Weighted Path Length)。具有最小带权路径长度的二叉树称为哈夫曼树 (Huffman Tr…

哈夫曼树(Huffman Tree)

定义 哈夫曼树又称最优二叉树&#xff0c;是一种带权路径长度最短的二叉树。所谓树的带权路径长度&#xff0c;就是树中所有的叶结点的权值乘上其到根结点的路径长度&#xff08;若根结点为0层&#xff0c;叶结点到根结点的路径长度为叶结点的层数&#xff09;。树的路径长度是…

哈夫曼树详解

一、哈夫曼树的介绍 Huffman Tree&#xff0c;中文名是哈夫曼树或霍夫曼树&#xff0c;它是最优二叉树。 定义&#xff1a;给定n个权值作为n个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若树的带权路径长度达到最小&#xff0c;则这棵树被称为哈夫曼树。 这个定义里面涉…

哈夫曼树(Huffmantree)

1.基本概念 哈夫曼树又称为最优树&#xff0c;是一类带权路径长度最短的树。 一些概念的定义&#xff1a; &#xff08;1&#xff09;路径&#xff1a;树的两个结点之间的连线称为路径。 &#xff08;2&#xff09;路径长度&#xff1a;路径上的分支数目称作路径长度。若规定…

哈夫曼树详解及其应用(哈夫曼编码)

一&#xff0c;哈夫曼树的基本概念 路径&#xff1a;从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 结点的路径长度&#xff1a;两结点之间路径上的分支数 树的路径长度&#xff1a;从树根到每一个结点的路径长度之和&#xff0e;记作&#xff1a;&#xff3…

哈夫曼树编码的实现+图解(含全部代码)

目录 哈夫曼树的基本概念 ------------哈夫曼树的构造方法 ------------------------哈夫曼编码 ------------------------------------全部代码 哈夫曼树的基本概念 哈夫曼树通常以二叉树的形式出现&#xff0c;所以也称最优二叉树&#xff0c;是一类带权路径长度最短的树…

哈夫曼树(C语言实现)

文章目录 哈夫曼树的基本概念哈夫曼树的构建构建思路代码实现 哈夫曼编码的生成编码生成思路代码实现 完整代码展示以及代码测试 哈夫曼树的基本概念 在认识哈夫曼树之前&#xff0c;你必须知道以下几个基本术语&#xff1a; 1、什么是路径&#xff1f; 在一棵树中&#xff0c…

打开VS2010提示:产品密钥框

打开VS2010提示&#xff1a;产品密钥框&#xff0c;如下图&#xff1a; …

VS 2017 产品密钥

个人分类&#xff1a; vs2010 Visual Studio 2017&#xff08;VS2017&#xff09; 企业版 Enterprise 注册码&#xff1a;NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Visual Studio 2017&#xff08;VS2017&#xff09; 专业版 Professional 激活码key&#xff1a;KBJFW-NXHK6-W4WJM-CRM…

vs++2010学习版的注册密钥

6VPJ7-H3CXH-HBTPT-X4T74-3YVY7 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行…

存储过程入门

参考文章 Oracle Database concepts guide&#xff08;11g2&#xff09; By Thomas KyteStored Procedure Wiki 先修知识 数据库的基本概念SQL 什么是存储过程&#xff08;Stored Procedure&#xff09;&#xff1a; 一段存储在数据库的“子程序”&#xff0c;下面对这两个…

【MySQL存储过程】创建一个简单的存储过程

什么是存储过程和函数 存储过程和函数是在数据库中定义的一些SQL语句的集合&#xff0c;然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可以避免开发人员重复编写相同的SQL语句。而且&#xff0c;存储过程和函数是在MySQL服务器中存储和执行的&…

什么是存储过程

什么是存储过程&#xff1a;存储过程可以说是一个记录集吧&#xff0c;它是由一些T-SQL语句组成的代码块&#xff0c;这些T-SQL语句代码像一个方法一样实现一些功能&#xff08;对单表或多表的增删改查&#xff09;&#xff0c;然后再给这个代码块取一个名字&#xff0c;在用到…

MySQL-存储过程

文章目录 存储过程一. 存储过程的创建和使用1. 创建存储过程2. 删除存储过程3. 查看存储过程4. 调用存储过程5. 例题 二. 变量1. 系统变量1.1 全局变量1.2 会话变量 2. 自定义变量2.1 用户变量2.2 局部变量 三. 存储过程参数3.1 说明&#xff1a;3.2 例题 四. 流程控制1. IF语句…

存储过程怎么使用

1.什么是存储过程&#xff1f; 存储过程是封装了一条或多条SQL的集合。它的好处是简单、高性能、安全。2.为什么要使用存储过程&#xff1f; 简化复杂的操作&#xff0c;把SQL封装起来容易使用。 如果所有开发人员和应用程序都使用同一存储过程&#xff0c;则所有使用的代码都…