创建哈夫曼树并求带权路径长度

【问题描述】根据给定的权重,构造哈夫曼树,输出其带权路径长度。
【输入形式】输入权重,空格作为分隔,回车结束,权重个数小于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次合并。

创建哈夫曼树并求带权路径长度相关推荐

  1. 计算WPL·哈夫曼树构建及带权路径长计算

    计算WPL·哈夫曼树构建及带权路径长计算 题目信息 输入 输出 测试样例 解答 想法 题目信息 Huffman编码是通信系统中常用的一种不等长编码,它的特点是:能够使编码之后的电文长度最短. 输入 第 ...

  2. 哈夫曼树带权路径长度c语言,【哈夫曼树】求结点的哈夫曼的带权路径长度

    本文用C++采用顺序存储实现求哈夫曼树(即最小生成树)的带权路径长度 努力 下面来了解一下哈夫曼树的构造以及如何求带权路径长度: 哈夫曼树为带权路径长度最小的树 哈夫曼树 哈夫曼树的顺序存储 [问题描 ...

  3. 构建哈夫曼树及求它的带权路径长度

    给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).要构成哈夫曼树,值比较大的叶子节点高度越低越好. ( ...

  4. 数据结构编程实践(七)创建哈夫曼树、生成哈夫曼编码、完成图片的压缩与解压缩

    一.对图片的压缩与解压缩,涉及以下内容: 1.文件读写 2.创建Huffman树 3.生成Huffman编码 4.压缩图片文件 5 .  解压缩图片文件 二.将项目分成三个小任务,下一任务是在上一任务 ...

  5. 【哈夫曼树】创建哈夫曼树

    文章目录 基础概念: 什么是路径? 什么是路径长度? 什么是[结点]的带权路径长度? 什么是[树]的带权路径长度? 如何构建一棵哈夫曼树? 1.构建森林: 设计哈夫曼树 优先级队列:(priority ...

  6. 哈夫曼树及求其WPL的算法

    哈夫曼树及求其WPL算法 一.概念 给定 N N N个权值作为 N N N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree ...

  7. 创建霍夫曼树,霍夫曼编码以及使用霍夫曼编码压缩文件

    那么,什么是霍夫曼树(赫夫曼树)呢? 给定n个权值(权值就是每个节点里面存放的数据,但是根据业务需求不同,存放的数据类型有些差别)作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样 ...

  8. c语言递归计算哈夫曼编码,哈夫曼树遍历求WPL和哈夫曼编码C语言--For初学者

    这篇文章使用纯c来写的,实现了生成哈夫曼树.求WPL和生成哈夫曼编码的应用,思路是,先定义一个结构体如下 typedef struct node { int weight; struct node * ...

  9. C++基于优先队列建立链式哈夫曼树并求哈夫曼编码及WPL

    优先队列指针类型自定义排序方法: struct cmp { // 使用仿函数(函数对象)作为Compare双参判断式bool operator()(const HTree &node1, co ...

最新文章

  1. CVPR2018上关于目标检测(object detection)
  2. Srping Boot日志输出(转)
  3. strcmp函数和strcpy函数
  4. 深入解读f-散度和f-GAN训练的相关数学性质
  5. 算法2:邻居好说话:冒泡排序
  6. mybatis Example 使用方法
  7. P2756,ssl2601-飞行员配对问题【网络流24题,最大匹配,dinic】
  8. 计算机辅助项目管理课程方案,天津大学计算机辅助管理研究生课程简介
  9. 7.1.8860.142
  10. bp神经网络matlab代码_基于Matlab的BP神经网络识别26个英文字母
  11. Java之JDBC连接池详解
  12. 浦发笔试考计算机知识么,浦发银行考试:笔试到底考什么?
  13. [026] 深度学习--学习笔记(4)Back-propagation反向传播链式法则理论推导
  14. 使用golang链接达梦数据库
  15. 2017146期计算机开机号,[彩吧]福彩3D17147期开机号103
  16. 需求工程方法及技术汇总
  17. 学校计算机社团面试自我介绍ppt,大学生大一社团面试自我介绍PPT
  18. 步进电机T型和S型速度曲线
  19. 百度开源了一款黑科技!超轻量级目标检测算法,网友:这也太好用了!
  20. 虚拟机防火墙以及端口操作

热门文章

  1. Android,页面3秒自东跳转和点击跳转显示
  2. Dockerfile 详解
  3. BBC纪录片《化学史》,看看历史上化学家们的脑洞有多大?
  4. Mac AppleScript实现Chrome浏览器自动化
  5. 代码质量管理开源平台Sonar
  6. [wp][GWCTF 2019]枯燥的抽奖
  7. 关于U8,U9中采购订单直接转PDF文件,然后直接发送给相应供应商的解决方案
  8. AI illustrator 如何裁剪图片(扣取局部区域)
  9. 第一章 国产MCU雅特力AT32 特有功能 资料介绍
  10. 嵌入式 hi3519平台uboot引导nfs文件系统