c 语言解码程序哈夫曼树,C++实现哈夫曼树编码解码

本文实例为大家分享了C++实现哈夫曼树的编码解码,供大家参考,具体内容如下

代码:

#pragma once

#include

#include

using namespace std;

#define m 20

stack s;

/*哈夫曼树结点类HuffmanNode声明*/

template

class HuffmanNode {

private:

HuffmanNode * left;

HuffmanNode * right;

T data;

int weight;

public:

HuffmanNode(){}

HuffmanNode(const T& item, HuffmanNode * l, HuffmanNode * r):data(item),left(l),right(r){}

HuffmanNode * getLeft() { return left; }

void setLeft(HuffmanNode * left) { this->left = left; }

HuffmanNode * getRight() { return right; }

void setRight(HuffmanNode * 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 HuffmanTree {

private:

HuffmanNode * root;

T data[m];

int weight[m];

int count;

public:

HuffmanTree(HuffmanNode * t=NULL):root(t){}

void CreateHuffmanTree();//创建哈夫曼树

HuffmanNode * getRoot() { return root; }

void setRoot(HuffmanNode * t) { root = t; }

void inputNodes();//输入各个结点的data和weight值

HuffmanNode * deCode(HuffmanNode*t,T item);

void showCode();

};

template

inline void HuffmanTree::CreateHuffmanTree()

{

inputNodes();

HuffmanNode ** H = new HuffmanNode*[count];

HuffmanNode * p1 = NULL, *p2 = NULL, * p,* t;

for (int i = 0; i < count; i++) {

H[i] = new HuffmanNode();

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();

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

inline void HuffmanTree::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

inline HuffmanNode* HuffmanTree::deCode( HuffmanNode * t,T item)

{

HuffmanNode * 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

inline void HuffmanTree::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

#include"HuffmanTree.h"

using namespace std;

int main() {

HuffmanTree * tree = new HuffmanTree();

tree->CreateHuffmanTree();

tree->showCode();

system("pause");

return 0;

}

测试数据:

n 1

s 3

t 4

a 10

i 12

p 13

e 15

Ctrl+Z 回车结束输入

输入时权值由小到大排序…也可以在程序里加一个排序

结果:

c20752e74672023a70bfaf194686e37e.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值