生成一棵赫夫曼树

来源:互联网 发布:淘宝上的三星s8靠谱吗 编辑:程序博客网 时间:2024/06/02 02:23
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

struct NODE
{
    int weight;//权值
    char c;
    NODE *left, *right;
};

struct DATA
{
    int weight;
    char c;//如果c不是0则左右孩子都是NULL,表示是叶子结点;否则是中间结点
};

struct COMP
{
    bool operator()(const DATA &data1, const DATA &data2)
    {
        return data1.weight < data2.weight;
    }
};

void CreatHufmanTree(NODE **T, std::vector<DATA> &dataVec)
{
    while(dataVec.size() != 1)
    {
        std::sort(dataVec.begin(), dataVec.end(), COMP());
        DATA data1 = dataVec.front();
        DATA data2 = *(dataVec.begin() + 1);
        dataVec.erase(dataVec.begin());
        dataVec.erase(dataVec.begin());
        
        NODE *tmp1;
        if(data1.c != 0)
        {
            //叶子结点
            tmp1 = new NODE;
            tmp1->left = NULL;
            tmp1->right = NULL;
            tmp1->c = data1.c;
            tmp1->weight = data1.weight;
        }
        else if(0 == data1.c)
        {
            //中间结点
            tmp1 = *T;
            tmp1->c = 0;
            tmp1->weight = data1.weight;
        }
        NODE *tmp2;
        if(data2.c != 0)
        {
            //叶子结点
            tmp2 = new NODE;
            tmp2->left = NULL;
            tmp2->right = NULL;
            tmp2->c = data2.c;
            tmp2->weight = data2.weight;
        }
        else if(0 == data2.c)
        {
            //中间结点
            tmp2 = *T;
            tmp2->c = 0;
            tmp2->weight = data2.weight;
        }

        NODE *node = new NODE;
        node->weight = data1.weight + data2.weight;
        node->c = 0;
        node->left = tmp1;
        node->right = tmp2;
        *T = node;

        DATA tmp;
        tmp.c = 0;
        tmp.weight = node->weight;
        dataVec.insert(dataVec.begin(), tmp);
    }
}

void PrintTree(NODE *T, std::string &str)
{
    NODE *p = T;
    if(p)
    {
        if(p->c != 0)
        {
            std::cout << str << ": " << p->c << std::endl;
            return;
        }
        if(p->left)
        {
            str += "0";
        }
        PrintTree(p->left, str);
        str.erase(str.end() - 1);
        if(p->right)
        {
            str += "1";
        }
        PrintTree(p->right, str);
        str.erase(str.end() - 1);
    }
}
int main(int nArgs, char* pArg[])
{
    
    std::vector<DATA> dataVec;
    DATA d;
    d.c = 'A';
    d.weight = 5;
    dataVec.push_back(d);
    d.c = 'B';
    d.weight = 15;
    dataVec.push_back(d);
    d.c = 'C';
    d.weight = 40;
    dataVec.push_back(d);
    d.c = 'D';
    d.weight = 30;
    dataVec.push_back(d);
    d.c = 'E';
    d.weight = 10;
    dataVec.push_back(d);

    NODE *t = NULL;
    NODE **T = &t;
    CreatHufmanTree(T, dataVec);
    std::string str = "";
    PrintTree(*T, str);

    system("pause");
    return 0;
}

原创粉丝点击