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

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

#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;  
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值