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; // 结点的 ...
随机推荐
- 第五次团队作业——【Alpha版本】随笔汇总
031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬涛 [Alp ...
- bzoj 3295 动态逆序对 CDQ分支
容易看出ans[i]=ans[i-1]-q[i],q[i]为删去第i个数减少的逆序对. 先用树状数组算出最开始的逆序对,预处理出每个数前边比它大的和后边比它小的,就求出了q[i]的初始值. 设b[i] ...
- Alpha阶段第九次Scrum Meeting
情况简述 Alpha阶段第九次Scrum Meeting 敏捷开发起始时间 2016/11/2 00:00 敏捷开发终止时间 2016/11/3 00:00 会议基本内容摘要 汇报进度,安排工作 参与 ...
- AXIS 调用 webservice服务时传递 服务器验证需要的用户名密码
System.setProperty("javax.net.ssl.trustStore", T.class.getResource(".").getPath( ...
- AE开发实现Spatial Join Analysis
总体网上资料不多,包括esri帮助文档都写的很简单,没有各个string参数如match_option之类的可以输入的string限制,导致在摸索中gp.Execute时报错n回. 结合网上搜集资料及 ...
- 广播接收者Receiver
一,动态创建网络状态监控 思路: 1:需要注册一个广播接收者,registerReceiver()需要两个参数 public Intent registerReceiver( BroadcastRec ...
- zabbix添加监控主机(三)
zabbix添加监控服务器. zabbix添加监控服务器(以添加10.10.100.137为例) (1)创建要监控的主机.点击配置(configuration)–>主机(host) –>创 ...
- IIS ARR 负载均衡
阅读:http://www.cnblogs.com/jesse2013/p/dlws-loadbalancer2.html 自定义端口:http://www.th7.cn/Program/net/20 ...
- Here String 中不该进行分词
我们知道,在 Shell 中,一个变量在被展开后,如果它没有被双引号包围起来,那么它展开后的值还会进行一次分词(word splitting,或者叫拆词,分词这个术语已经被搜索引擎相关技术占用了)操作 ...
- 精选9个值得学习的 HTML5 效果【附源码】
这里精选了一组很酷的 HTML5 效果.HTML5 是现 Web 开发领域的热点, 拥有很多让人期待已久的新特性,特别是在移动端,Web 开发人员可以借助 HTML5 强大功能轻松制作各种交互性强.效 ...