C++实现哈夫曼树编码解码
作者:qq_36795903 发布时间:2022-02-13 15:48:09
标签:C++,哈夫曼树
本文实例为大家分享了C++实现哈夫曼树的编码解码,供大家参考,具体内容如下
代码:
#pragma once
#include<iostream>
#include<stack>
using namespace std;
#define m 20
stack<int> s;
/*哈夫曼树结点类HuffmanNode声明*/
template<class T>
class HuffmanNode {
private:
HuffmanNode<T> * left;
HuffmanNode<T> * right;
T data;
int weight;
public:
HuffmanNode(){}
HuffmanNode(const T& item, HuffmanNode<T> * l, HuffmanNode<T> * r):data(item),left(l),right(r){}
HuffmanNode<T> * getLeft() { return left; }
void setLeft(HuffmanNode<T> * left) { this->left = left; }
HuffmanNode<T> * getRight() { return right; }
void setRight(HuffmanNode<T> * right) { this->right=right; }
T& getData() { return data; }
void setData(const T& item) { data = item; }
int getWeight() { return weight; }
void setWeight(int weight) { this->weight = weight; }
};
/*哈夫曼树类HuffmanTree声明*/
template<class T>
class HuffmanTree {
private:
HuffmanNode<T> * root;
T data[m];
int weight[m];
int count;
public:
HuffmanTree(HuffmanNode<T> * t=NULL):root(t){}
void CreateHuffmanTree();//创建哈夫曼树
HuffmanNode<T> * getRoot() { return root; }
void setRoot(HuffmanNode<T> * t) { root = t; }
void inputNodes();//输入各个结点的data和weight值
HuffmanNode<T> * deCode(HuffmanNode<T>*t,T item);
void showCode();
};
template<class T>
inline void HuffmanTree<T>::CreateHuffmanTree()
{
inputNodes();
HuffmanNode<T> ** H = new HuffmanNode<T>*[count];
HuffmanNode<T> * p1 = NULL, *p2 = NULL, * p,* t;
for (int i = 0; i < count; i++) {
H[i] = new HuffmanNode<T>();
H[i]->setData(data[i]);
H[i]->setWeight(weight[i]);
H[i]->setLeft(NULL);
H[i]->setRight(NULL);
}
for (int i = 0; i < count - 1; i++) {
p = new HuffmanNode<T>();
p1 = H[i];
p2 = H[i + 1];
p->setLeft(p1);
p->setRight(p2);
p->setWeight(p1->getWeight() + p2->getWeight());
//将新的结点插入结点数组中的合适位置,并将被合并的两个结点删除
t = p;
int j = i + 2;
while ( j < count &&H[j]->getWeight() < t->getWeight()) {
H[j - 1] = H[j];
j++;
}
H[j - 1] = t;
}
root = H[count - 1];
}
template<class T>
inline void HuffmanTree<T>::inputNodes()
{
int i = 0;
for (int j = 0; j < m; j++) {
data[j] = NULL;
weight[j] = 0;
}
while (cin >> data[i] >> weight[i]) {
i++;
}
count = i;
}
template<class T>
inline HuffmanNode<T>* HuffmanTree<T>::deCode( HuffmanNode<T> * t,T item)
{
HuffmanNode<T> * p, * q;
if(t==NULL)
return NULL;
if (t->getData() == item)
return t;
if ((p = deCode(t->getLeft(), item))!=NULL) {
s.push(0);
return p;
}
else if((q = deCode(t->getRight(), item))!=NULL){
s.push(1);
return q ;
}
}
template<class T>
inline void HuffmanTree<T>::showCode()
{
cout << root->getWeight() << endl;
cout << (root->getLeft())->getRight()->getData() << endl;
for (int i = 0; i < count; i++) {
cout << data[i] << "——";
deCode(root, data[i]);
while (!s.empty()) {
cout << s.top();
s.pop();
}
cout << endl;
}
}
测试程序:
#include<iostream>
#include"HuffmanTree.h"
using namespace std;
int main() {
HuffmanTree<char> * tree = new HuffmanTree<char>();
tree->CreateHuffmanTree();
tree->showCode();
system("pause");
return 0;
}
测试数据:
n 1
s 3
t 4
a 10
i 12
p 13
e 15
Ctrl+Z 回车结束输入
输入时权值由小到大排序…也可以在程序里加一个排序
结果:
来源:https://blog.csdn.net/qq_36795903/article/details/89916203


猜你喜欢
- 本来是想写一篇《委托与lambda表达式的前世今生》,但仅委托部分已经写了很多内容,于是就此分开关于Lambda表达是的内容后续再写吧。不知
- SpringDataJpa创建中间表//fetch=FetchType.EAGER 关闭懒加载 相当于hibernate中的lazy=fal
- 字体池的应用,主要是为了解决字体不断创建导致句柄泄漏/内存泄漏的问题,这个问题在Android上也同样存在。经测试,C# WinForm原生
- Quartz是一款开源的定时任务调度框架,Quartz的官网是:http://www.quartz-s
- 这篇文章主要介绍了如何基于java语言实现八皇后问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 在上篇文章给大家介绍了Android Studio 3.6 正式版终于发布了,快来围观,需要的朋友可以点击查看,今天给大家分享我安装Andr
- C# 中没有四舍五入函数,程序语言都没有四舍五入函数,因为四舍五入算法不科学,国际通行的是 Banker 舍入法Bankers roundi
- 概述从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章.贪心算法贪心算法 (Greedy Algorithm)
- 如果需要处理的数字有许多位,就可以使用BitArray类和BitVector32结构。BitArray类位于System.Collectio
- 线程启动:1.start() 和 run()的区别说明start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。sta
- 在类中自定义的“函数”称为“方法”,由于C#是完全面向对象的
- @Order控制配置类/AOP/方法/字段的加载顺序1.AOP加载顺序 @Component &nbs
- Android 6.0版本对于程序员兄弟来说最不友好的就是权限的问题,动态权限的设置曾经让我很苦恼,目前大部分关于6.0权限设置的框架基本都
- 1、注解(Annotation)1.1 什么是注解(Annotation)注解不是程序本身,可以在程序编译、类加载和运行时被读取,并执行相应
- SingleClick:@Retention(AnnotationRetention.RUNTIME)@Target(AnnotationT
- 简介机器可以读,人为什么不能读?只要我们掌握java class文件的密码表,我们可以把二进制转成十六进制,将十六进制和我们的密码表进行对比
- 1.用intellij idea 创建了一个springboot的项目,前期都运行的好好的,在ide中可以正常运行,但是打包成Jar运行却一
- 前言最近在用 MVP + RxJava + Retrofit 写项目,觉得相对于其他的开发框架,这的确是给我们带来了很多方便,但是在网上搜寻
- Android 调用系统相机拍摄获取照片的两种方法实现实例在我们Android开发中经常需要做这个一个功能,调用系统相机拍照,然后获取拍摄的
- 工具准备jdk, maven, tomcat9, vscode;上述软件的安装配置在百度就能找到很多教程, 所以此处不详述.(jdk使用1.