#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] = '