哈夫曼树

#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;
}
原文地址:https://www.cnblogs.com/vhyc/p/5503185.html