zoukankan      html  css  js  c++  java
  • Huffman树编码-优先队列实现

    Huffman编码是之前一道算法作业题,最近又要复习考试了,先把这个的代码再看一下吧。

    算法原理很简单,使用优先队列将两个节点弹出,然后合并节点之后再入队列如此循环做下去即可。

    主要问题在于树的修改问题,出队的树进行修改,然后将其合并成为一个新的树,在弹出的时候,树的两个节点地址已定,但是由于循环这两个地址会进行修改,所以单独写了一个函数用来进行树的复制。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<vector>
     4 #include<string.h>
     5 #include<queue>
     6 using namespace std;
     7 typedef struct tree{
     8     struct tree *left;
     9     struct tree *right;
    10     int data;
    11 }Tree;
    12 
    13 struct cmp
    14 {
    15        bool operator()(const Tree &t1,const Tree &t2)
    16        {
    17            return t1.data>t2.data;
    18        }
    19 };
    20 int a[8]={1,1,2,5,3,8,13,21};//乱序
    21 int code[10]={0};
    22 int m=0;
    23 void printhuffman(Tree *huffman)
    24 {
    25     if(huffman->left!=NULL)
    26     {
    27         code[m]=0;m++;
    28         printhuffman(huffman->left);
    29         m--;
    30     }
    31     if(huffman->right!=NULL)
    32     {
    33         code[m]=1;m++;
    34         printhuffman(huffman->right);
    35         m--;
    36     }
    37     if(huffman->left==NULL&&huffman->right==NULL)
    38     {
    39         printf("The code of frequency is %3d :",huffman->data);
    40         for(int i=0;i<m;i++)
    41             printf("%d ",code[i]);
    42         printf("
    ");
    43         return ;
    44     }
    45 }
    46 void copytree(Tree **a,Tree *b)
    47 {
    48     *a=new Tree();
    49     if(b->left==NULL&&b->right==NULL)
    50     {
    51         (*a)->left=NULL;(*a)->right=NULL;
    52         (*a)->data=b->data;
    53         return;
    54     }
    55     if(b->left!=NULL)
    56     {
    57         (*a)->left=b->left;
    58         copytree(&((*a)->left),b->left);
    59     }
    60     (*a)->data=b->data;
    61     if(b->right!=NULL)
    62     {
    63         (*a)->right=b->right;
    64         copytree(&((*a)->right),b->right);
    65     }
    66 
    67 }
    68 int main()
    69 {
    70     int n=8;
    71     priority_queue<Tree,vector<Tree>,cmp> minnode;
    72     Tree huffman;
    73     
    74     for(int i=0;i<n;i++)
    75     {
    76         Tree *newtree=new Tree();
    77         newtree->data=a[i];
    78         newtree->left=NULL;
    79         newtree->right=NULL;
    80         minnode.push(*newtree);
    81     }
    82     while(minnode.size()>=2)
    83     {
    84         Tree temp1=minnode.top();minnode.pop();
    85         Tree temp2=minnode.top();minnode.pop();
    86         Tree *temp3=new Tree();
    87         temp3->left=NULL;
    88         temp3->right=NULL;
    89         temp3->data=0;
    90         copytree(&temp3->left,&temp1);
    91         copytree(&temp3->right,&temp2);
    92         temp3->data=(*(temp3->left)).data+(*(temp3->right)).data;
    93         minnode.push(*temp3);
    94     }
    95     huffman=minnode.top();
    96     printhuffman(&huffman);
    97     return 0;
    98 }

    运行结果:

  • 相关阅读:
    LeetCode——字符串解码
    LeetCode——迷宫 i-ii
    JavaScript实现按照指定长度为数字前面补零输出的方法
    React 修改input按钮上文字
    HTML input可以输入相同的文件
    LeetCode——重新安排行程
    LeetCode——矩阵中的最长递增路径
    c++ vector push_back对象的时候存起来的是拷贝
    char* = "name" g++报告warn的原因
    虚函数表指针、父类成员变量、子类成员变量在内存中的位置关系
  • 原文地址:https://www.cnblogs.com/holyprince/p/4098233.html
Copyright © 2011-2022 走看看