• 哈夫曼树


    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    typedef struct Tree
    {
        int weight;
        int parent, lchild, rchild;
    }Tree, *HuffmanTree;
    
    void Select(HuffmanTree HT, int i, int &s1, int &s2)
    {//选就小的两个点
        int min = 10000;
        s1 = 1;
        int j,t;
        for ( j = 1; j <= i; j++)//选出第一个
        {
            if (!HT[j].parent&& HT[j].weight < min)//有双亲,就是被选过的不能再次备选
            {
                min = HT[j].weight;
                s1 = j;
                t = j;
            }
        }
        min = 1000;
        for (int j = 1; j <= i; j++)//选出第二个
        {
            if (!HT[j].parent&&j!=t && HT[j].weight < min)
            {
                min = HT[j].weight;
                s2 = j;
            }
        }
    }
    void createHuffmanTree(HuffmanTree &HT, int n)
    {
        int m = n * 2-1;
        HT = new Tree[m+1];
        for (int i = 1; i <= m; i++)
        {
            HT[i].parent = 0;
            HT[i].lchild = 0;
            HT[i].rchild = 0;
        }
        for (int i = 1; i <= n; i++)
        {
            cin >> HT[i].weight;
        }
    //---------------------初始化---------------------
        for (int i = n + 1; i <= m; i++)
        {
            int s1, s2;
            Select(HT, i-1, s1, s2);
            HT[s1].parent = i;
            HT[s2].parent = i;
            HT[i].weight = HT[s1].weight + HT[s2].weight;
            HT[i].lchild = s1;
            HT[i].rchild = s2;
        }
    }
    
    void createHuffmanCode(HuffmanTree &HT, int n)
    {
        char* cd = new char[n];
        cd[n - 1] = '';
        for (int i = 1; i <= n; i++)
        {
            int start = n - 1;
            int c = i;
            int f = HT[i].parent;
            for (; f != 0;)
            {
                --start;
                if (HT[f].lchild == c)cd[start] = '0';
                else cd[start] = '1';
                c = f;
                f = HT[f].parent;
            }
            cout << &cd[start] << endl;
        }
    }
    
    int main()
    {
        HuffmanTree HT;
        createHuffmanTree(HT, 8);
        createHuffmanCode(HT, 8);//这个只能在里面输出,传出去还不会
        for (int i = 1; i <16; i++)
        {
        cout <<i<<"  "<< HT[i].weight << "  " << HT[i].parent << "  " << HT[i].lchild << "  " << HT[i].rchild << endl;
        }//输出数据
        //string a("1234"), b("ds");
        //HC.push_back(a);
        //HC.push_back(b);
        //for (int i = 0; i <8; i++)
        //    cout << HC[i] << endl;
    }
  • 相关阅读:
    FreeTextbox 中吃掉Server路径的问题
    .net 中发mail到hotmail中乱码问题的解决
    管理的技巧和沟通
    将近一个星期都没来园子里面了
    园子里面西安的朋友请进来
    又开始乱了
    google真是个小人
    周末的晴天
    pm2入门
    strlen与sizeof区别 冷夜
  • 原文地址:https://www.cnblogs.com/vhyc/p/5503185.html
Copyright © 2020-2023  润新知