赫夫曼编码


#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值