哈夫曼编码(二叉树+改写优先队列)

二叉树的建立以及优先队列,前期先对数据进行处理,将所有的字符进行一个频率的统计,并且记录在一个结构体指针数组里面,来进行后续的构建,优先队列要进行改写,将其中的比较函数,改写成最小堆的形式,只需要加入一个参数即可。然后将所有的结构体至今分配空间放入最小堆中,用一个中间节点去连接。最后返回堆中最后一个元素的地址即可。

对于结果的打印只需要一个二叉树的遍历即可,传入一个字符串,如果遍历左树就加0,右树就加1。最后打印出来的就是不重复的Huffman前缀码。

 

#include
using namespace std;
const int maxn=1001;
#define inf 0x3f3f3f3f
typedef struct node* BinTree;
struct node{
    double w;
    int v;
    BinTree l,r;
};
struct cmp
{
     bool operator()(BinTree a,BinTree b)
    {
        return a->w>b->w;
    }
};
BinTree edge[maxn];
 int a[maxn];
 int n,m;//m个不重复的元素;
priority_queue,cmp >q;

void init()
{
    sort(a+1,a+1+n);
    int j=0;
    int count=1;
    a[n+1]=inf;
    for(int i=0;il=edge[i]->r=NULL;
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i]==a[i+1])
        {
           count++;
        }
        else
        {
            edge[++j]->v=a[i];
           // cout<<"a: "<w=double(count)/double(n);
            //edge[j].index=0;
            q.push(edge[j]);
            count=1;
        }
    }
    m=j;
}

BinTree solve()
{
   while(!q.empty()&&q.size()>=2)
   {   BinTree tree;
       tree=(BinTree)malloc(sizeof(struct node));
       BinTree x=q.top();
       cout<v<<" "<w<v<<" "<w<l=x;
        tree->r=y;
        tree->v=x->v+y->v;
        tree->w=x->w+y->w;
        q.push(tree);
   }
   BinTree temp=q.top();
   return temp;
}


void print(BinTree tmp,string a)
{
    if(tmp!=NULL)
    {
    print(tmp->l,a+"0");
    if(tmp->l==NULL&&tmp->r==NULL)
    {
     cout<<"数字:"<v<<"频率:"<w<<"编码:"<r,a+"1");
    }
}


int main()
{

    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
   init();
   BinTree tmp=solve();
   string a="";
   print(tmp,a);



}

 

你可能感兴趣的:(优先队列二叉树)