哈夫曼编码(代码实现)

在我们有了建立哈夫曼树的能力之后,其实哈夫曼编码十分好实现,我们只需要一次遍历便可以将所有的哈夫曼编码集合成一个哈夫曼编码表了,具体代码如下。

//建立哈夫曼编码节点
//为了方便建立,这里使用的链表结构
struct haffMapNode      
{
    char symbol;       //实际字符
    string code;          //对应编码
    haffMapNode* next;
};

//头结点
struct haffMap
{
    haffMapNode* head;
};

//递归遍历二叉树
void travelHaffTree(haffMap* (&mapHead),haffTree* tree,string code)
{
//传入一个code来记录遍历的编码
    if(tree->lChild == NULL && tree->rChild == NULL)
    {
//当到最后的叶子节点的时候,这就是我们需要编码的字符
        haffMapNode* node = new haffMapNode;
        node->code = code;
        node->symbol = tree->symbol;
        node->next = NULL;

//链表插入
        if(mapHead->head == NULL)
        {
            mapHead->head = node;
        }
        else
        {
            node->next = mapHead->head;
            mapHead->head = node;
        }
    }
//当左子树不为NULL时,说明可以向左走,code追加‘0’
    if(tree->lChild != NULL)
    {
        code.push_back('0');
        travelHaffTree(mapHead,tree->lChild,code);
        code.pop_back();           //清除之前追加的字符,为了不影响之后向右走(在同一层中)
    }
//同理 
    if(tree->rChild != NULL)
    {
        code.push_back('1');
        travelHaffTree(mapHead,tree->rChild,code);
        code.pop_back();
    }
}

//建立哈夫曼编码图
haffMap* creataHaffMap(haffTreeRoot* root)
{
    haffMap* mapHead = new haffMap;
    mapHead->head = NULL;

    string code;

    travelHaffTree(mapHead,root->next,code);
    return mapHead;
}

这就是简单的建立哈夫曼编码图的方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 最近在做智能穿戴设备的项目,需要将一些状态数据集合传输回APP端,由于数据集合稍大,如果原封不动地将集合传输过去,...
    rh_Jameson阅读 6,033评论 1 7
  • 什么是哈夫曼树(Huffman Tree)eg:将百分制的考试成绩转换为五分制的成绩if ( score < 60...
    Spicy_Crayfish阅读 6,430评论 1 1
  • 定义指针变量,如果不赋给它地址,系统会随机给它分配一个地址。 C++标准库 C++ Standard Librar...
    纵我不往矣阅读 2,444评论 0 1
  • 简介 哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。 定义:给定 n 个权值作为 n 个叶子节点,构造...
    随时学丫阅读 8,458评论 0 1
  • 把工作和生活当做军训,不断演习 今天的晨读内容只有三条却都是满满的干货,点子太棒了,可我们要怎样应用到实际中呢? ...
    兜兜有糖902阅读 1,823评论 0 0

友情链接更多精彩内容