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; // 结点的 ...
随机推荐
- mysql Workbench 执行删除命令
SET SQL_SAFE_UPDATES = 0;delete from table1; SET SQL_SAFE_UPDATES = 1;
- JS中的进制转换以及作用
js的进制转换, 分为2进制,8进制,10进制,16进制之间的相互转换, 我们直接利用 对象.toString()即可实现: //10进制转为16进制 ().toString() // =>&q ...
- 【SQL】Oracle分页查询的三种方法
[SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...
- 对dom的理解
js对dom的操作可以理解为: 增.删.改.查 获取对象:查 对象操作:增,修,删 内容操作:innerHTML,innerText等 事件操作:mouse,key 样式操作:id,tag,class ...
- TeamViewer12.0.71503(远程控制软件)精简版 单文件企业版介绍
TeamViewer 是一款能在任何防火墙和 NAT 代理的后台用于远程控制,桌面共享和文件传输的简单且快速的解决方案.为了连接到另一台计算机,只需要在两台计算机上同时运行 TeamViewer 即可 ...
- Windows操作系统
Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家 ...
- 纯js+css实现loading等待效果
此插件是基于jqueryUI的widget,下面是具体实现代码 第一部分css: /***loading***/ .loading-box{ position:absolute; text-align ...
- Android 签名证书
Android APK的数字签名的作用和意义 http://blog.csdn.net/gaomatrix/article/details/6568191 http://jingyan.baidu.c ...
- iframe框架在IE浏览器,360兼容浏览器下将白色背景设为透明色
<IFRAME ID="Frame1" SRC="transparentBody.htm"></IFRAME> iframe在大部分浏览 ...
- jsp页面中引用其他页面的方法
初看这个标题....大家的感觉一定是好2啊.....博主一定要说jsp的动态引用(jsp:include)和静态引用(@include)了.介绍这两者区别的文章已经烂大街了..一搜一大把..博主竟然还 ...