创建哈夫曼树并求带权路径长度
创建哈夫曼树并求带权路径长度
【问题描述】根据给定的权重,构造哈夫曼树,输出其带权路径长度。
【输入形式】输入权重,空格作为分隔,回车结束,权重个数小于10。
【输出形式】哈夫曼树的带权路径长度。
【样例输入】5 6 2 9 7
【样例输出】65
【样例说明】
【评分标准】
#include<iostream>
#include<cstdlib>
#include<cstdio>
#define MAX_SIZE 10
#define MAX 100
using namespace std;
typedef struct
{int weight;int parent, lchild, rchild;
}HTNode, *HuffmanTree;
void Select(HuffmanTree HT, int k, int &s1, int &s2) //在HT[1...i-1]中选择parent为0,且weight最小的两个结点,分别赋给s1,s2
{int i, min;min = MAX;for (i = 1; i <= k; i++){if (HT[i].parent == 0 && min > HT[i].weight){s1 = i;min = HT[i].weight;}}min = MAX;for (i = 1; i <= k; i++){if (i != s1 && HT[i].parent == 0 && HT[i].weight < min){s2 = i;min = HT[i].weight;}}
}
void CreateHuffmanTree(HuffmanTree &HT, int *w, int n) //创建哈夫曼树,不求哈夫曼编码HC
{int m, i, s1, s2;if (n <= 1)return;m = 2 * n - 1;HT = new HTNode[m + 1];for (i = 1; i <= m; i++){HT[i].weight = i <= n ? w[i - 1] : 0;HT[i].parent = HT[i].lchild = HT[i].rchild = 0;}s1 = s2 = 0;for (i = n + 1; i <= m; i++) //建哈夫曼树{Select(HT, i - 1, s1, s2);HT[i].lchild = s1;HT[i].rchild = s2;HT[s1].parent = HT[s2].parent = i;HT[i].weight = HT[s1].weight + HT[s2].weight;}
}
void PrintHuffmanTree(HuffmanTree HT, int n)
{int m, i;m = 2 * n - 1;for (i = 1; i <= m; i++){cout << i << " " << HT[i].weight << " " << HT[i].parent << " " << HT[i].lchild << " " << HT[i].rchild << endl;}
}
int WeightedPathLength(HuffmanTree HT, int n) //求带权路径的长度
{int len, i, k, t;len = t = 0;for (i = 1; i <= n; i++){ //哈夫曼树的特性决定:每一个双亲必有左右孩子,根节点除外for (k = HT[i].parent, t = 0; k != 0; k = HT[k].parent) //到根节点结束,即求出了路径长度t++;len += HT[i].weight*t;}return len;
}
int main(void)
{int n, len, w[MAX_SIZE];HuffmanTree HT;n = 0;do //输入权重,按回车结束{cin >> w[n];n++;} while (getchar() != '\n');CreateHuffmanTree(HT, w, n);len = WeightedPathLength(HT, n);cout << len << endl;system("pause");return 0;
}
用例二叉树:
存储结构:
运行案例:
说明:
1.在哈夫曼树的构造过程中,需要频繁地访问结点的双亲,故采用静态三叉链表。
2.n个叶子结点的哈夫曼树,结点总数是确定的,共有2n-1个结点。
3.哈夫曼树上只含有度为0和度为2的结点,不存在度为1的结点。
4.构造n个权值的哈夫曼树,共需进新n-1次合并。
创建哈夫曼树并求带权路径长度相关推荐
- 计算WPL·哈夫曼树构建及带权路径长计算
计算WPL·哈夫曼树构建及带权路径长计算 题目信息 输入 输出 测试样例 解答 想法 题目信息 Huffman编码是通信系统中常用的一种不等长编码,它的特点是:能够使编码之后的电文长度最短. 输入 第 ...
- 哈夫曼树带权路径长度c语言,【哈夫曼树】求结点的哈夫曼的带权路径长度
本文用C++采用顺序存储实现求哈夫曼树(即最小生成树)的带权路径长度 努力 下面来了解一下哈夫曼树的构造以及如何求带权路径长度: 哈夫曼树为带权路径长度最小的树 哈夫曼树 哈夫曼树的顺序存储 [问题描 ...
- 构建哈夫曼树及求它的带权路径长度
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).要构成哈夫曼树,值比较大的叶子节点高度越低越好. ( ...
- 数据结构编程实践(七)创建哈夫曼树、生成哈夫曼编码、完成图片的压缩与解压缩
一.对图片的压缩与解压缩,涉及以下内容: 1.文件读写 2.创建Huffman树 3.生成Huffman编码 4.压缩图片文件 5 . 解压缩图片文件 二.将项目分成三个小任务,下一任务是在上一任务 ...
- 【哈夫曼树】创建哈夫曼树
文章目录 基础概念: 什么是路径? 什么是路径长度? 什么是[结点]的带权路径长度? 什么是[树]的带权路径长度? 如何构建一棵哈夫曼树? 1.构建森林: 设计哈夫曼树 优先级队列:(priority ...
- 哈夫曼树及求其WPL的算法
哈夫曼树及求其WPL算法 一.概念 给定 N N N个权值作为 N N N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree ...
- 创建霍夫曼树,霍夫曼编码以及使用霍夫曼编码压缩文件
那么,什么是霍夫曼树(赫夫曼树)呢? 给定n个权值(权值就是每个节点里面存放的数据,但是根据业务需求不同,存放的数据类型有些差别)作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样 ...
- c语言递归计算哈夫曼编码,哈夫曼树遍历求WPL和哈夫曼编码C语言--For初学者
这篇文章使用纯c来写的,实现了生成哈夫曼树.求WPL和生成哈夫曼编码的应用,思路是,先定义一个结构体如下 typedef struct node { int weight; struct node * ...
- C++基于优先队列建立链式哈夫曼树并求哈夫曼编码及WPL
优先队列指针类型自定义排序方法: struct cmp { // 使用仿函数(函数对象)作为Compare双参判断式bool operator()(const HTree &node1, co ...
最新文章
- CVPR2018上关于目标检测(object detection)
- Srping Boot日志输出(转)
- strcmp函数和strcpy函数
- 深入解读f-散度和f-GAN训练的相关数学性质
- 算法2:邻居好说话:冒泡排序
- mybatis Example 使用方法
- P2756,ssl2601-飞行员配对问题【网络流24题,最大匹配,dinic】
- 计算机辅助项目管理课程方案,天津大学计算机辅助管理研究生课程简介
- 7.1.8860.142
- bp神经网络matlab代码_基于Matlab的BP神经网络识别26个英文字母
- Java之JDBC连接池详解
- 浦发笔试考计算机知识么,浦发银行考试:笔试到底考什么?
- [026] 深度学习--学习笔记(4)Back-propagation反向传播链式法则理论推导
- 使用golang链接达梦数据库
- 2017146期计算机开机号,[彩吧]福彩3D17147期开机号103
- 需求工程方法及技术汇总
- 学校计算机社团面试自我介绍ppt,大学生大一社团面试自我介绍PPT
- 步进电机T型和S型速度曲线
- 百度开源了一款黑科技!超轻量级目标检测算法,网友:这也太好用了!
- 虚拟机防火墙以及端口操作