zoukankan      html  css  js  c++  java
  • 哈夫曼树及解码

    添加上解码。

    解码要求:

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

    解码过程:

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

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

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

    for(int i=0;i<lens;i++)
        {
            if(s[i]=='0')
            {
                if(p->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 <bits/stdc++.h>
      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<node*,vector<node*>,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<lens;i++)
     50     {
     51         if(s[i]=='0')
     52         {
     53             if(p->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("
    ");
     72 }
     73 
     74 void printInfo(const node *tree,string code)
     75 {
     76     if(tree->lchild==NULL&&tree->rchild==NULL)
     77     {
     78         cout<<tree->ch<<":"<<code<<"  ";
     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<node*,vector<node*>,greater<node*> >que;
     97     while(~scanf("%d",&n))
     98     {
     99         node *tree=createTree(n);
    100         printf("Huffman code:
    ");
    101         printInfo(tree,"");
    102         printf("
    ");
    103         decode(s,tree);
    104         deleteTree(tree);
    105     }
    106 }
    View Code

    输入:

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

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

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

  • 相关阅读:
    C#基础篇十小练习
    C#基础篇九OOP属性结构枚举
    C#基础篇八构造函数和面向对象思想
    C#基础篇七类和静态成员
    C#基础篇六飞行棋
    C#基础篇五值类型和引用类型
    数据与地址的自动给定---基于状态机
    SPI 核的寄存器空间
    mig_7series DDR控制器的配置
    关于zynq7 中MIO的理解
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/4986116.html
Copyright © 2011-2022 走看看