哈夫曼树以及哈夫曼编码

本文介绍了如何创建哈夫曼树并实现哈夫曼编码。通过C++代码展示了从输入结点权值到构建哈夫曼树及生成编码的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>

#include <string.h>

using namespace std;

#define N 1000

struct HufmTree//哈夫曼树

{

  charch;//结点字符

  intweight;//结点的权值

  intparent,lchild,rchild;

};

struct HuffmanCode

{

   char ch;

    charbits[N+1];

};

HufmTree tree[N];//哈夫曼树

HuffmanCode h[N];//哈夫曼编码

void select(HufmTree tree[],int n,int&min1,int &min2)

//选出parent 的值为0且权值最小的两个结点

{

    intmw1=100000,mw2=100000;

   for(int i=1;i<=n;i++)

    {

       if(tree[i].parent!=0)continue;

        if(tree[i].weight<=mw1)

       {

           mw2=mw1;

           mw1=tree[i].weight;

           min2=min1;

           min1=i;

       }

       else

       if(tree[i].weight<mw2)

       {

           mw2=tree[i].weight;

           min2=i;

        }

    }

 

}

void CreatHuffman(HufmTree *tree,int n)//n为结点个数

{

   if(n<=1)return;

    intm=2*n;

   for(int i =1;i<m;i++)//初始化结点

    {

       tree[i].parent=0;

       tree[i].lchild=0;

       tree[i].rchild=0;

       tree[i].weight=0;

    }

   for(int i=1;i<=n;i++)//读入结点

    {

       cin>>tree[i].ch;

       cin>>tree[i].weight;

    }

   for(int i=n+1;i<m;i++)

    {

       int min1,min2;//min1,min2,保存权值最小的两个结点的下标

       select(tree,i-1,min1,min2);

       tree[min1].parent=i;tree[min2].parent=i;

       tree[i].lchild=min1;tree[i].rchild=min2;

       tree[i].weight= tree[min1].weight + tree[min2].weight ;

    }

}

void HuffmanCoding(HufmTree *tree,HuffmanCode*h,int n)//n为结点个数

{

    intc,p;

    intstart;

   char cd[n+1];

   cd[n]='\0';

    for(inti=1;i<=n;i++)

    {

       h[i].ch=tree[i].ch;

       start = n;

       c=i;

       p=tree[c].parent;

       while(p==tree[c].parent)

       {

           if(tree[p].lchild==c)// 如果tree[c]是tree[p]的左孩子,则生成代码‘0’

                cd[--start]='0';

            else

                cd[--start]='1';

           c=p;

           if(p==2*n-1)break;

           else p=tree[p].parent;

       }

       for(int j=start;j<=n;j++)

       {

           h[i].bits[j-start]=cd[j];

       }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值