#include#include #include #include 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] = '\0'; 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 < <<" "<< 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;}