//最优二叉树
#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树实现_详细注释的更多相关文章

  1. Qt5_简易画板_详细注释

    代码下载链接:  http://pan.baidu.com/s/1hsc41Ek 密码: 5hdg 显示效果如下: 代码附有详细注释(代码如下) /*** * 先新建QMainWindow, 项目名称 ...

  2. "飞机大战"游戏_Java实现_详细注释

    1 package cn.xiaocangtian.Util; import java.awt.Frame; import java.awt.Graphics; import java.awt.Ima ...

  3. Java_太阳系_行星模型_小游戏练习_详细注释

    //实现MyFrame--实现绘制窗口,和实现重写 重画窗口线程类 package cn.xiaocangtian.Test; import java.awt.Frame; import java.a ...

  4. QT_SVG格式图片浏览器_源代码下载_详细注释

    源代码链接: http://pan.baidu.com/s/1pKA5Vcv 密码: ib2x 注:SVG格式图片特点: 1. 文件小 2. 图像中文字独立于图像, 可以编辑,可搜索. 3.没有字体限 ...

  5. 构造数列Huffman树总耗费_蓝桥杯

    快排! /** 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的 ...

  6. Huffman树与编码的简单实现

    好久没写代码了,这个是一个朋友问的要C实现,由于不会C,就用JAVA写了个简单的.注释掉的代码属性按照原来朋友发的题里带的参数,发现没什么用就给注释掉了. package other; import ...

  7. 一套强大的vim配置文件+详细注释

    phpchina折腾王独家配置,灰常牛叉的一套vim配置,另附有详细注释,自己折腾vim的时候可以参照其中的大部分设置进行一些个性化定制."是否兼容VI,compatible为兼容,noco ...

  8. huffman树即Huffma编码的实现

    自己写的Huffman树生成与Huffman编码实现 (实现了核心功能 ,打出了每个字符的huffman编码 其他的懒得实现了,有兴趣的朋友可以自己在我的基础增加功能 ) /* 原创文章 转载请附上原 ...

  9. Huffman树

    结点定义: /* * Huffman树结点定义 */ struct Node { ElementType weight; // 结点的权值 struct Node *leftChild; // 结点的 ...

随机推荐

  1. Ceph RGW 的 OSPF负载均衡 + quagga的配置

      随着开源技术的发展,以及商业设备价格的不断攀升.大公司总是希望能使用开源的方案来替换过去使用的商业设备.比如之前大家用的很多的F5和A10,现在已经在逐步被LVS替换.传统的单个lvs的性能是比不 ...

  2. shell浅谈之九子shell与进程处理

    转自:http://blog.csdn.net/taiyang1987912/article/details/39529291 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] ...

  3. 教你一招:解决Win10 win7 删除文件或文件夹时提示“找不到该项目”

    问题很怪异,解决的办法却很简单. 首先,分析问题 使用不可显示ASCII字符或采用UNICODE字符方法创建的文件或文件夹: 名称中含有..等特殊符号文件或文件夹名称不符合Windows命名规范或建立 ...

  4. mui日期插件$, each遍历,EventListener事件监听,json格式

    (function($) { $.init(); var result = $('#result')[0]; var btns = $('.btn'); btns.each(function(i, b ...

  5. String()与 toString()

    我们知道String()与 .toString()都是可以转换为字符串类型,但是String()与 .toString()的还是有区别的 1..toString()可以将所有的的数据都转换为字符串,但 ...

  6. 【BZOJ-1340】Escape逃跑问题 最小割

    1340: [Baltic2007]Escape逃跑问题 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 264  Solved: 121[Submit] ...

  7. Python【第三章】:python 面向对象 (new)

    面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...

  8. IBatis存储过程返回值

    <parameterMaps> <parameterMap id="delVersionBagInfoParam" class="DelVersionB ...

  9. 一次完整的HTTP请求所经历的7个步骤

    HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1. 建立TCP连接在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连 ...

  10. html5新增的主体结构元素

    1.  article 主体结构元素 通常是一篇文章.一个页面.一个独立完整的内容模块一般会带个标题,并放在 header 标签中,article 元素可以互相嵌套,使用频率极高,强调独立性,多注意下 ...