博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
哈夫曼树及解码
阅读量:5313 次
发布时间:2019-06-14

本文共 2993 字,大约阅读时间需要 9 分钟。

添加上解码。

解码要求:

  根据输入的01字符串输出相对应的字符。

解码过程:

(1)node *p,p作为移动指针,在已经构造好的哈夫曼树中进行移动。移动规则,遇到0向左子树移动,遇到1向右子树移动。

(2)输入01字符串s(可以用string也可以用char数组,在此使用string),求出串的长度s.size().

(3)进入循环,进行相应判断以及输出。关键代码:

for(int i=0;i
lchild!=NULL) { p=p->lchild; } } else if(s[i]=='1') { if(p->rchild!=NULL) { p=p->rchild; } } if(p->lchild==NULL&&p->rchild==NULL) { printf("%c",p->ch); p=tree; }

给出全部代码以及运行实例:

1 #include 
2 #define max_size 10010 3 char c[max_size]; 4 double f[max_size]; 5 6 using namespace std; 7 typedef struct node 8 { 9 char ch; 10 double freq; 11 node *lchild; 12 node *rchild; 13 node(char c=0,double f=0,node *l=NULL,node *r=NULL): 14 ch(c),freq(f),lchild(l),rchild(r) {} 15 }; 16 typedef struct cmp 17 { 18 bool operator()(node*&a,node*&b) 19 { 20 return a->freq>b->freq; 21 } 22 }; 23 node* createTree(int n) 24 { 25 priority_queue
,cmp>que; 26 for(int i=1; i<=n; i++) 27 { 28 cin>>c[i]>>f[i]; 29 que.push(new node(c[i],f[i])); 30 } 31 while(que.size()>1) 32 { 33 node *l=que.top(); 34 que.pop(); 35 node *r=que.top(); 36 que.pop(); 37 node *newnode=new node(0,l->freq+r->freq,l,r); 38 que.push(newnode); 39 } 40 return que.top(); 41 } 42 43 void decode(string s,node *tree) 44 { 45 node *p=tree; 46 cin>>s; 47 getchar(); 48 int lens=s.size(); 49 for(int i=0;i
lchild!=NULL) 54 { 55 p=p->lchild; 56 } 57 } 58 else if(s[i]=='1') 59 { 60 if(p->rchild!=NULL) 61 { 62 p=p->rchild; 63 } 64 } 65 if(p->lchild==NULL&&p->rchild==NULL) 66 { 67 printf("%c",p->ch); 68 p=tree; 69 } 70 } 71 printf("\n"); 72 } 73 74 void printInfo(const node *tree,string code) 75 { 76 if(tree->lchild==NULL&&tree->rchild==NULL) 77 { 78 cout<
ch<<":"<
<<" "; 79 return; 80 } 81 if(tree->lchild!=NULL)printInfo(tree->lchild,code+'0'); 82 if(tree->rchild!=NULL)printInfo(tree->rchild,code+'1'); 83 } 84 85 void deleteTree(node *tree) 86 { 87 if(tree->lchild!=NULL)deleteTree(tree->lchild); 88 if(tree->rchild!=NULL)deleteTree(tree->rchild); 89 delete(tree); 90 } 91 92 int main() 93 { 94 int n; 95 string s; 96 priority_queue
,greater
>que; 97 while(~scanf("%d",&n)) 98 { 99 node *tree=createTree(n);100 printf("Huffman code:\n");101 printInfo(tree,"");102 printf("\n");103 decode(s,tree);104 deleteTree(tree);105 }106 }
View Code

 

输入:

首先输入要构造的哈夫曼树有多少的元素。

然后输入每个元素以及其出现的频率(上面全部设为1)

然后输入01串,对其按照上面哈夫曼树的规则进行解码。

转载于:https://www.cnblogs.com/zpfbuaa/p/4986116.html

你可能感兴趣的文章
win7远程桌面连接
查看>>
深入浅出JMS(一)——JMS简单介绍
查看>>
[PTA] 数据结构与算法题目集 6-4 链式表的按序号查找 & 6-5 链式表操作集 & 6-6 带头结点的链式表操作集...
查看>>
观察者模式(Observer)
查看>>
DPDK编译步骤
查看>>
Python基础理论 - 面向对象
查看>>
数据仓库建设—维度建模
查看>>
(转载)Ubuntu 安装GNU Scientific library(GSL)
查看>>
java Map常用方法封装
查看>>
欧几里德与扩展欧几里德算法
查看>>
python中深浅拷贝
查看>>
python中numpy.r_和numpy.c_
查看>>
MySQL关于sql_mode的修改(timestamp的默认值不正确)
查看>>
laravel如何打印orm封装的sql语句
查看>>
大道至简阅读笔记02
查看>>
如何让在panel里的子窗体随panel的大小改变而变化?(转)
查看>>
Concurrent包总结——线程安全的集合操作
查看>>
WPF简单模拟QQ登录背景动画
查看>>
Where to go from here
查看>>
Bitmap和Drawable相互转换方法
查看>>