代码如下:

#include <iostream>
#include <string>
using namespace std;
const unsigned int n = 8;//字符数NUM,这里的字符数为8
const unsigned int m = 2 * n - 1;//结点总数
const float MAX = 1e8;class HTNode
{friend class HuffmanTree;
private:float weight;int parent;int lchild;int rchild;
};class HuffmanTree
{public:HuffmanTree();~HuffmanTree() = default;void PrintCode();
private:void DFS(int i, int step);void Select(int k, int  &s1, int  &s2);HTNode HT[m + 1];int code[m + 1];
};HuffmanTree::HuffmanTree()
{int s1, s2;for (int i = 1; i <= m; i++){HT[i].weight = 0;HT[i].parent = -1;HT[i].lchild = -1;HT[i].rchild = -1;}cout << "Please input the weight" << endl;for (int i = 1; i <= n; i++)cin >> HT[i].weight;for (int i = n + 1; i <= m; i++){Select(i - 1, s1, s2);HT[s1].parent = i;HT[s2].parent = i;HT[i].lchild = s1;HT[i].rchild = s2;HT[i].weight = HT[s1].weight + HT[s2].weight;cout << HT[i].weight << " " << "(" << HT[s1].weight << "," << HT[s2].weight << ")" << endl;//该输出为测试数据使用}
}void HuffmanTree::Select(int k, int &s1, int &s2)
{HT[0].weight = MAX;s1 = s2 = 0;for (int i = 1; i <= k; i++)if (HT[i].weight != 0 && HT[i].parent == -1){if (HT[i].weight < HT[s1].weight){s2 = s1;s1 = i;}elseif (HT[i].weight < HT[s2].weight) s2 = i;}
}void HuffmanTree::DFS(int i,int step)
{if (HT[i].lchild == -1 && HT[i].rchild == -1){cout << HT[i].weight << " = ";for (int i = 0; i < step; i++)cout << code[i];cout << endl;return;}if (HT[i].lchild != -1 ){code[step] = 0;DFS(HT[i].lchild,step+1);}if (HT[i].rchild != -1 ){code[step] = 1;DFS(HT[i].rchild, step+1);}
}void HuffmanTree::PrintCode()
{for (int i = 0; i < m + 1; i++) code[i] = false;DFS(m, 0);
}int main()
{HuffmanTree t;cout << endl;t.PrintCode();return 0;
}

测试结果:

动态内存分配写法:

#include <iostream>
using namespace std;
const int MAX = 1e8;class HuffmanNode
{friend class HuffmanTree;
private:double w;int par;int lch;int rch;
};class HuffmanTree
{friend class HuffmanTree;
public:HuffmanTree() ;~HuffmanTree();void PrintCode();
private:void dfs(int i,int s);void Select(int n, int &s1, int &s2);HuffmanNode *HT;int *path;int m;
};void HuffmanTree::Select(int n, int &s1, int &s2)
{s1 = s2 = 0;HT[0].w = MAX;for (int i = 1; i <= n; i++){if (HT[i].par==-1 && HT[i].w!=0)if (HT[i].w < HT[s1].w){s2 = s1;s1 = i;}elseif (HT[i].w < HT[s2].w) s2 = i;}
}HuffmanTree::HuffmanTree() :HT(nullptr), path(nullptr)
{cout << "Please input node:" << endl;int n;cin >> n;m = 2 * n - 1;HT = new HuffmanNode[m + 1];for (int i = 1; i <= m; i++){HT[i].par = -1;HT[i].lch = -1;HT[i].rch = -1;HT[i].w = 0;}for (int i = 1; i <= n; i++) cin >> HT[i].w;for (int i = n + 1; i <= m; i++){int s1, s2;Select(i - 1, s1, s2);HT[s1].par = i;HT[s2].par = i;HT[i].lch = s1;HT[i].rch = s2;HT[i].w = HT[s1].w + HT[s2].w;cout << HT[i].w << " " << "(" << HT[s1].w << "," << HT[s2].w << ")" << endl;}
}void HuffmanTree::dfs(int i,int s)
{if (HT[i].lch == -1 && HT[i].rch == -1){cout << HT[i].w << " = ";for (int i = 0; i < s; i++) cout << path[i];cout << endl;return;}if (HT[i].lch != -1){path[s] = 0;dfs(HT[i].lch, s + 1);}if (HT[i].rch != -1){path[s] = 1;dfs(HT[i].rch, s + 1);}
}void HuffmanTree::PrintCode()
{path = new int[m + 1];for (int i = 0; i < m + 1; i++) path[i] = 0;dfs(m,0);delete[]path;path = nullptr;
}HuffmanTree::~HuffmanTree()
{delete[] HT;HT = nullptr;
}int main()
{HuffmanTree t;t.PrintCode();return 0;
}

测试结果:

C++ class实现Huffman树(完整代码)相关推荐

  1. 算法#16--B树完整代码Java实现

    定义 在计算机科学中,B树(英语:B-tree)是一种自平衡的树,能够保持数据有序.这种数据结构能够让查找数据.顺序访问.插入数据及删除的动作,都在对数时间内完成. 为什么要引入B树? 首先,包括前面 ...

  2. 深夜爆肝:万字长文3种语言实现Huffman树(强烈建议三连)

    文章目录 一.C语言能干大事 1. C语言下Huffman树的计算过程分析 2. C语言下Huffman树的编程 二.C#语言也不赖 1. C#下Huffman类的设计 2. C#中界面设计 3. 建 ...

  3. 基于B树的图书管理系统(C语言)(含完整代码)

    目录: 一.实现的设计要求 1.基本要求 2.额外选做要求 二.项目文件管理 三.完整代码 1.实现的接口 2.头文件 BTreeBook.h 全部代码 3.源文件 BTreeBook.cpp 全部代 ...

  4. Huffman树的原理以及代码构建

    我们的目标认识只是基础,代码实现是才是核心 1.Huffman树的定义: 从树中一个结点到另一个结点的之间的分支构成两个结点之间的路径,路径上的分支数称为路径长度.那么树的路径长度就是从树根到每一个结 ...

  5. 树状数组详解(超详细)(完整代码在四 五最后)

    一,树状数组的优点 前缀和的思想,可以通过O(n)的预处理,使得多次查询区间值都是o(1),但只能解决不修改,多次查询的问题. 差分思想,能通过差分数组,将区间修改变成O(1)的,最后通过一次O(n) ...

  6. Python实现蒙特卡洛树黑白棋完整代码

    Python实现的基于蒙特卡洛树搜索的完整代码 最终效果:在控制台输入输出,实现3种玩家(AI或者人类或者随机)的对弈 目录 一.黑白棋简介 二.蒙特卡洛树搜索简介 1.蒙特卡洛树搜索Monte Ca ...

  7. huffman树【严蔚敏】

    huffman树(最优二叉树)的基本操作及其定义 假设有n个权值,则构造出的哈夫曼树有n个叶子结点. n个权值分别设为 w1.w2.-.wn,则哈夫曼树的构造规则为: (1) 将w1.w2.-,wn看 ...

  8. 【机器学习入门】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集

    各位同学好,今天和大家分享一下python机器学习中的决策树算法,在上一节中我介绍了决策树算法的基本原理,这一节,我将通过实例应用带大家进一步认识这个算法.文末有完整代码和数据集,需要的自取.那我们开 ...

  9. huffman树和huffman编码

    不知道为什么,我写的代码都是又臭又长. 直接上代码: #include <iostream> #include <cstdarg> using namespace std; c ...

最新文章

  1. 安川g7接线端子图_西门子SIWAREX称重模块安装接线注意事项!
  2. java list多字段排序_java中list通过多条件排序
  3. 阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶 1
  4. Tensorflow基本开发步骤——以逻辑回归拟合二维数据为例
  5. vmware提示com.vmware.sps.fault.QsConnectionException报错
  6. oracle---函数(trunc,nvl,nvl2)
  7. 工作一年后,我有些感悟(写于2017年)
  8. 16-elasticsearch6.x {“error“:“Content-Type header [application/x-www-form-urlencoded] is not support
  9. 昼猫笔记 JavaScript -- 闭包
  10. 管理表空间和数据文件——建立表空间——建立字典管理表空间和建立加密表空间...
  11. Metamask + remix:在ropsten测试链上取出已经部署的合约并进行一些操作
  12. A[1083]List Grade 水题
  13. 5gh掌上云计算认证不通过_2018年阿里云ACP云计算认证多少分通过,怎么报名,如何参加考试...
  14. 【周末福利日】资料免费赠送
  15. 8.0之后关闭个人热点功能实现
  16. 瑞郎走弱有助于瑞士国家银行MogaFX外汇储备增加
  17. 火焰图(FlameGraph)的使用
  18. 【Linux】系统管理命令
  19. 一个汽车软件测试工程师的三年工作总结
  20. 广告平台精准推送系统解决方案架构

热门文章

  1. 【ArcGIS微课1000例】0005:空间连接(Spatial Join)
  2. 【地理建模】空间统计分析:空间权重矩阵、全局空间自相关、局部空间自相关
  3. 在Arcmap中加载互联网地图资源的4种方法
  4. C语言试题十二之m个人的成绩存放在score数组中,请编写函数function,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指定的数组中。
  5. Android图片上倒计时,Android自定义照相机倒计时拍照
  6. linux生成地图,ROS中利用V-rep进行地图构建仿真
  7. java 只有日期的类_JAVA日期和时间类彻底解决(1)[转]
  8. ​“北斗女神”徐颖,32岁成为中科院最年轻的博导!
  9. 点开那些优秀的硕博士们的朋友圈,他们都有这些特点!
  10. 面试可以,但别打扰我睡觉! | 今日最佳