日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

优先级队列实现哈夫曼树的编码和译码

發(fā)布時(shí)間:2023/11/27 生活经验 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 优先级队列实现哈夫曼树的编码和译码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//優(yōu)先級(jí)隊(duì)列實(shí)現(xiàn)的哈夫曼樹的編碼和譯碼   
  
#include<iostream>      
#include<queue>      
#include<string>      
using namespace std;    class Node     
{    
public:    float weight;    Node* left;    Node* right;    char ch;    Node(float w,Node* l=NULL,Node* r=NULL,char c=' '):weight(w),ch(c),left(l),right(r) {}    Node(float w,char c=' '):weight(w),ch(c),left(NULL),right(NULL) {}    
};    class cmp    
{    
public :    bool operator()(Node* a,Node* b)    {    return a->weight>b->weight;    }    
};  vector<int> v;     
void Encode(Node* r)//打印字符的編碼       
{     if(r->left==NULL && r->right==NULL)     {     cout << r->ch <<": ";     for (int i = 0;i<v.size();++i)     cout << v[i];     cout << endl;     v.pop_back();     return ;     }     if(r->left)     {     v.push_back(0);     Encode(r->left);     }     if(r->right)     {     v.push_back(1);     Encode(r->right);     }    if(!v.empty())    {    v.pop_back();    }    
}    void Decode(Node* root, string s)//譯碼       
{    Node* p=root;    for(int i=0;i<s.length();++i)    {    if(s[i]=='0')     {    if(p->left) p=p->left;    else     {    cout<<s<<" Can't decode!"<<endl;    return ;    }    }     if(s[i]=='1')     {     if(p->right) p=p->right;    else     {    cout<<s<<" Can't decode!"<<endl;     return ;    }    }    }    cout<<s<<": "<<p->ch<<endl;    
}    void freeTree(Node* p)//銷毀哈夫曼樹      
{    if(p->left!=NULL)    freeTree(p->left);    if(p->right!=NULL)    freeTree(p->right);    delete p;    p=NULL;    
}    int main()    
{    Node* m1,*m2;    char ch[]={'A','C','E','D','F','G'};//字符       float f[]={0.1,0.3,0.4,0.5,0.2,0.6};//頻率       
  priority_queue<Node*,vector<Node*>,cmp> q;    int n=sizeof(ch)/sizeof(ch[0]);    for(int i=0;i<n;++i)    {    q.push(new Node(f[i],ch[i]));    cout<<ch[i]<<": "<<f[i]<<'\t';     }    cout<<endl;    for(int i=1;i<n;++i)    {    m1=q.top(); q.pop();    m2=q.top(); q.pop();    float w=m1->weight+m2->weight;    q.push(new Node(w,m1,m2));    }    Node* root=q.top();    Encode(root);    cout<<endl;    Decode(root,"1011");    freeTree(root);    return 0;    
}  

?

轉(zhuǎn)載于:https://www.cnblogs.com/luxiaoxun/archive/2012/08/04/2622626.html

總結(jié)

以上是生活随笔為你收集整理的优先级队列实现哈夫曼树的编码和译码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。