Huffman树实现_详细注释
//最优二叉树
#include <iostream>
#include <iomanip>
using namespace std; //定义结点类型
//【weight | lchid | rchild | parent】
//为了判定一个结点是否已加入到要建立的哈夫曼树中
//可通过parent域的值来确定.
//初始时parent = -1,当结点加入到树中时,该结点parent的值
//为其父亲结点在数组Huffman中的序号.
template<typename T>
struct HuffNode {
T weight; //权值
int parent; //指向父节点的指针域(结点元素的下标)
int lch; //左指针域
int rch; //右指针域
}; //哈夫曼树的构造算法
template<typename T>
HuffNode<T> *HuffmanTree(int n, const T& sign) //生成最优二叉树
{
const int MAX_VALUE = ;
int i, j, min1, min2, x1, x2; //min1为最小值, min2为次小值, x1位最小值下标, x2位次小值下标
HuffNode<T> *ht = new HuffNode<T>[ * n - ]; //一个含有n个叶子结点的最优二叉树,总共有2*n-1个结点
HuffNode<T> *huffNode = ht;
for (i = ; i < * n - ; i++) //最优二叉树结点数组初始化
{
huffNode[i].weight = ; //权值都设为0
huffNode[i].parent = -; //父节点,左右孩子结点
huffNode[i].lch = -;
huffNode[i].rch = -; //都设置为-1,-1代表空
}
for (i = ; i < n; i++) //依次输入n个叶子结点的权值
cin >> huffNode[i].weight; for (i = ; i < n - ; i++)
{
min1 = min2 = MAX_VALUE;
// x1, x2 用来保存找到的两个最小结点在数组中的位置
x1 = x2 = ;
for (j = ; j < n + i; j++) //因为外循环每循环一次,实际结点个数增加到n+i个
{
if (huffNode[j].weight < min1 && huffNode[j].parent == -)
{
min2 = min1; //存在权值小于min1, 则min1赋值给次小值
x2 = x1; //次小值下标改变
min1 = huffNode[j].weight; //当前权值赋值给最小值
x1 = j; //并保存最小值下标
}
else if (huffNode[j].weight < min2 && huffNode[j].parent == -)
{
min2 = huffNode[j].weight; //当前值赋值给次小值
x2 = j; //保存次小值下标
}
}
//将找出的两个子树合并成一颗子树
//对找到的两个最小结点的父指针域进行赋值
huffNode[x1].parent = n + i;
huffNode[x2].parent = n + i;
//新合成树位置上的权值
huffNode[n + i].weight = huffNode[x1].weight + huffNode[x2].weight;
//两个最小结点的父结点的左右孩子域进行操作
huffNode[n + i].lch = x1;
huffNode[n + i].rch = x2;
}
return ht;
} template<typename T>
void ShowHTree(HuffNode<T> *HT, int nodeNum)
{
HuffNode<T> *p = HT;
int k;
cout << "k" << "\t\t" << "Weight" << "\t\t" << "Parent"
<< "\t\t" << "Lchild" << "\t\t" << "Rchild" << endl;
for (k = ; k < * nodeNum - ; k++)
{
cout << k << "\t\t" << (p + k)->weight << "\t\t"
<< (p + k)->parent << "\t\t"
<< (p + k)->lch << "\t\t" << (p + k)->rch << endl;
}
} int main()
{
int n;
HuffNode<int> *huffNode;
int sign = ; //标志为权值的类型 cout << "请输入叶子结点个数: " << endl;
cin >> n;
huffNode = HuffmanTree(n, sign);
ShowHTree(huffNode, n); system("pause"); return ;
}
Huffman树实现_详细注释的更多相关文章
- Qt5_简易画板_详细注释
代码下载链接: http://pan.baidu.com/s/1hsc41Ek 密码: 5hdg 显示效果如下: 代码附有详细注释(代码如下) /*** * 先新建QMainWindow, 项目名称 ...
- "飞机大战"游戏_Java实现_详细注释
1 package cn.xiaocangtian.Util; import java.awt.Frame; import java.awt.Graphics; import java.awt.Ima ...
- Java_太阳系_行星模型_小游戏练习_详细注释
//实现MyFrame--实现绘制窗口,和实现重写 重画窗口线程类 package cn.xiaocangtian.Test; import java.awt.Frame; import java.a ...
- QT_SVG格式图片浏览器_源代码下载_详细注释
源代码链接: http://pan.baidu.com/s/1pKA5Vcv 密码: ib2x 注:SVG格式图片特点: 1. 文件小 2. 图像中文字独立于图像, 可以编辑,可搜索. 3.没有字体限 ...
- 构造数列Huffman树总耗费_蓝桥杯
快排! /** 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的 ...
- Huffman树与编码的简单实现
好久没写代码了,这个是一个朋友问的要C实现,由于不会C,就用JAVA写了个简单的.注释掉的代码属性按照原来朋友发的题里带的参数,发现没什么用就给注释掉了. package other; import ...
- 一套强大的vim配置文件+详细注释
phpchina折腾王独家配置,灰常牛叉的一套vim配置,另附有详细注释,自己折腾vim的时候可以参照其中的大部分设置进行一些个性化定制."是否兼容VI,compatible为兼容,noco ...
- huffman树即Huffma编码的实现
自己写的Huffman树生成与Huffman编码实现 (实现了核心功能 ,打出了每个字符的huffman编码 其他的懒得实现了,有兴趣的朋友可以自己在我的基础增加功能 ) /* 原创文章 转载请附上原 ...
- Huffman树
结点定义: /* * Huffman树结点定义 */ struct Node { ElementType weight; // 结点的权值 struct Node *leftChild; // 结点的 ...
随机推荐
- Android开发之XUtils框架使用和报错处理
一.XUtils lib的的添加: 1.点击+,选择第一个Library dependency 2.输入XUtils 按enter键,搜索: 3.然后就是选择XUtils,选择哪个版本就看个人了,接 ...
- Linux 部署 nginx服务代理
原文地址:http://www.cnblogs.com/ants/p/5732337.html#_label5 参考地址:http://www.cnblogs.com/hustskyking/p/ng ...
- Android 摇一摇功能的注意事项
/**开始重力传感器的检测*/ public void start() { // 获得传感器管理器 sensorManager = (SensorManager) mContext.getSystem ...
- 在canvas中使用html元素
让div悬浮于canvas之上 使用z-index控制层及顺序 慕课网canvas demo <div id="canvas-wrapper"> <canva ...
- 表格不被内容撑大,且超出的内容变为省略号(css)
今天写代码,发现表格会被内容撑大,影响到了网页的整体布局. 百度了一解决方法,下面是代码和我的备注 table{table-layout: fixed;} //固定表格 table td ...
- a版本冲刺第三天
队名:Aruba 队员: 黄辉昌 李陈辉 林炳锋 鄢继仁 张秀锋 章 鼎 学号 昨天完成的任务 今天做的任务 明天要做的任务 困难点 体会 408 看了构建之法的第二章和十三章 完成学习Java ...
- PDFobject插件使用,PDF在线查看插件
1.引入插件JS <script type="text/javascript" src="PDFobject.js"></script> ...
- flask-whooshalchemy需要注意的一点
在学习mega—tutorial时全文搜索模块遇到了问题,那就是使用全文搜索查询出来的数据为空的列表,输出了sql语句后发现where后没有条件,困扰了许久,后来才发现是自己不细心,在进行全文索引时应 ...
- HSF和Dubbo有什么区别
一. 以下摘录自企业级分布式应用服务EDAS官网段落 RPC服务 提供对Dubbo和HSF两个RPC框架的支持.阿里巴巴第一代RPC框架Dubbo是国内第一款成熟的商用级RPC框架,已于2011年正式 ...
- [UML]UML系列——用例图Use Case
用例图的概念 用例图是描述用例.参与者以及它们之间关系的图. 用例图的作用 用例图是从用户的角度来描述对信息系统的需求,分析产品的功能和行为. 用例图定义和描述了系统的外部可见行为,是分析.设计直至组 ...