赫夫曼编码

来源:互联网 发布:华丽上班族电影知乎 编辑:程序博客网 时间:2024/05/16 15:42

#include "stdafx.h"
#include<vector>
#include<queue>
#include<iostream>
using namespace std;

class HaffmanNode
{
public:
HaffmanNode(int nKeyValue,HaffmanNode*pleft=NULL,HaffmanNode *pright=NULL)
{
m_nkeyvalue =nKeyValue;
m_pleft=pleft;
m_pright=pright;
}
public:
int m_nkeyvalue;
HaffmanNode *m_pleft;
HaffmanNode *m_pright;
};
struct cmp{
bool operator ()(HaffmanNode *a,HaffmanNode *b){ 
        return a->m_nkeyvalue>b->m_nkeyvalue;//最小值优先  
    }  
};

class HaffmanCoding
{
public :
typedef priority_queue<HaffmanNode*,vector<HaffmanNode*>,cmp> MinHeap;
typedef HaffmanNode* HaffmanTree;
HaffmanCoding(const vector<int> &weight):m_pTree(NULL)
{
m_stCount=weight.size();
for(size_t i=0;i<weight.size();i++)
{
m_minheap.push(new HaffmanNode(weight[i],NULL,NULL));
}
}
~HaffmanCoding()
{
_destroy(m_pTree);
}
 void doHaffmanCoding ()
    {
        vector<int> vnCode(m_stCount-1) ;
        constructtree () ;
        traverse (m_pTree, 0, vnCode) ;
    }
public:
void _destroy(HaffmanTree &ht)
{
if(ht->m_pleft!=NULL)
{
_destroy(ht->m_pleft);
}
if(ht->m_pright!=NULL)
{
_destroy(ht->m_pright);
}
if(ht->m_pleft==NULL&&ht->m_pright==NULL)
{
delete ht;
ht=NULL;
}
}
void traverse(HaffmanTree ht,int layers,vector<int> &vncode)
{
if(ht->m_pleft!=NULL)
{
vncode[layers]=0;
traverse(ht->m_pleft,++layers,vncode);
--layers;
}
if(ht->m_pright!=NULL)
{
vncode[layers]=1;
traverse(ht->m_pright,++layers,vncode);
--layers;
}
if(ht->m_pleft==NULL&&ht->m_pright==NULL)
{
cout<<ht->m_nkeyvalue<<"coding:";
for(int i=0;i<layers;++i)
{
cout<<vncode[i]<<" ";
}
cout<<endl;
}
}
void constructtree()
{
size_t i=1;
while(i<m_stCount)
{
HaffmanNode *lchild=m_minheap.top();
m_minheap.pop();
HaffmanNode *rchild=m_minheap.top();
m_minheap.pop();
HaffmanNode* pNewNode =new HaffmanNode(lchild->m_nkeyvalue+rchild->m_nkeyvalue,lchild,rchild);
m_minheap.push(pNewNode);
++i;
}
m_pTree =m_minheap.top();
m_minheap.pop();
}
private:
vector<int> m_vnWeight;
HaffmanTree m_pTree;
MinHeap m_minheap;
size_t m_stCount;
};

int _tmain(int argc, _TCHAR* argv[])
{  
vector<int> vnWeight ;
vnWeight.push_back (45) ;
    vnWeight.push_back (13) ;
    vnWeight.push_back (12) ;
    vnWeight.push_back (16) ;
    vnWeight.push_back (9) ;
    vnWeight.push_back (5) ;
HaffmanCoding c(vnWeight);
c.doHaffmanCoding() ;
return 0;
}
0 0
原创粉丝点击