【源代码】C++算法(七)哈夫曼树建造与编码

日常说明:首先博主也是菜鸟一枚,有错误欢迎大家指正。另外本博客所有的代码博主编写后均调试
通过。重要提醒!!!!博主使用的是VS2017,如果有低版本的小伙伴
最好新建空项目将此代码复制上去。

更多算法请关注我的算法专栏https://blog.csdn.net/column/details/20417.html
运行截图:
这里写图片描述
这里写图片描述
HuffmanCoding.h

#pragma once
//=============================================================
// CopyrigHtree (C) 2018-2118
// 机器名称:     ASUS-EK
// 项目名:       HuffmanCode
// 创建人:       shilei
// 创建时间:     2018.4.9
//=============================================================
#define _CRT_SECURE_NO_WARNINGS  
#include<iostream>
#include<cstring>
#include<cstdlib>
#include"malloc.h"

using namespace std;
typedef int DataType;

typedef struct
{
    char character;
    int weight;
    DataType parent, lchild, rchild;
}HTNode, *HuffmanTree;
typedef char **HuffmanCode;

void Select(HuffmanTree&Htree, int n, int &s1, int &s2)
{
    s1 = s2 = 0;
    int i;
    for (i = 1; i <= n; ++i) {
        if (0 == Htree[i].parent) {
            if (0 == s1) {
                s1 = i;
            }
            else {
                s2 = i;
                break;
            }
        }
    }
    if (Htree[s1].weight > Htree[s2].weight) {
        int t = s1;
        s1 = s2;
        s2 = t;
    }

    for (i += 1; i <= n; ++i) {
        if (0 == Htree[i].parent) {
            if (Htree[i].weight < Htree[s1].weight) {
                s2 = s1;
                s1 = i;
            }
            else if (Htree[i].weight < Htree[s2].weight) {
                s2 = i;
            }
        }
    }
}
void CreatHT(HuffmanTree&Htree, HuffmanCode&HC)//n个字符
{
    int m;
    int n;
    cout << "请输入字符的个数: ";
    cin >> n;
    cout << "请分别输入" << n << "个字符及其权值,以空格相隔:" << endl;
    int s1, s2;
    if (n <= 1) return;
    char *p = new char[4];
    m = 2 * n - 1;
    //Htree = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));//0号单元未用
    Htree = new HTNode[m + 1];
    Htree[0].weight = m;
    for (int i = 1; i <= n; ++i)
    {
        cin >> Htree[i].character;
        cin >> Htree[i].weight;
    }
    for (int i = 1; i <= m; ++i)
    {
        Htree[i].parent = 0;
        Htree[i].lchild = 0;
        Htree[i].rchild = 0;
    }
    for (int i = n + 1; i <= m; ++i)
    {
        Htree[i].weight  = 0;
    }//三个for循环为哈夫曼树初始化
    for (int i = n + 1; i <= m; ++i)
    {
        Select(Htree, i-1, s1, s2);
        Htree[s1].parent = i;
        Htree[s2].parent = i;
        Htree[i].lchild = s1;
        Htree[i].rchild = s2;
        Htree[i].weight = Htree[s1].weight + Htree[s2].weight;
    }//建造哈夫曼树
    HC = (char**)malloc((n + 1) * sizeof(char *));
    /*HC = new char*[n + 1];*/
    char *cd = new char[n];
    /*cd = (char*)malloc(n * sizeof(char));*/
    cd[n - 1] = '\0';
    int f, c;
    for (int i = 1; i <= n; ++i)
    {
        int start;
        start = n - 1;
        for (c = i, f = Htree[i].parent; f != 0; c = f, f = Htree[f].parent)
        {
            if (Htree[f].lchild == c)  cd[--start] = '0';
            else
            {
                cd[--start] = '1';
            }
            HC[i] = new char[n - start];
            strcpy(HC[i], &cd[start]);
        }
    }
    delete[]cd;
}




main.cpp

#include"HuffmanCoding.h"

int main()
{

    HuffmanTree HT;
    HuffmanCode HC;
    CreatHT(HT,HC);
    cout << "index" << " " << "weight" << "  " << "parent" << "  " << "lchild" << "  " << "rchild"<<endl;
    for (int i = 1, p = HT[0].weight; i <= p; ++i)
    {
        cout << "-----------------------------------------" << endl;
        cout << i << "     ";
        cout << HT[i].weight << "       ";
        cout << HT[i].parent << "       ";
        cout << HT[i].lchild << "       ";
        cout << HT[i].rchild << endl;

    }
    cout << endl;
    cout << "***************************************************"<<endl;
    for (int i = 1, p = HT[0].weight; i <= p; ++i)
    {
        cout << HT[i].character << " ";
        cout << HC[i] << endl;

    }
    cout << endl;
    return 0;
}
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值