哈弗曼树
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 1000
struct HTNode{
char data;
int weight;
int parent;
int lchild;
int rchild;
} ht[maxn*2-1];
struct HCode{
char code[maxn];
int length;
} hcd[maxn];
char str[maxn];
void build_HT(HTNode ht[], int n){
int i, j, k, lnode, rnode;
int min1, min2;
for (i = 0; i < 2*n-1; i++) ht[i].parent = ht[i].lchild = ht[i].rchild = -1;
for (i = n; i<2 * n - 1; i++) {
min1 = min2 = 1 << 30; //将min1、min2置为最大
lnode = rnode = -1;
for (k = 0; k <= i - 1; k++)
if (ht[k].parent == -1) {
if (ht[k].weight<min1) {
min2 = min1; rnode = lnode;
min1 = ht[k].weight; lnode = k;
}
else if (ht[k].weight < min2) {
min2 = ht[k].weight; rnode = k;
}
}
ht[i].weight = ht[lnode].weight + ht[rnode].weight;
ht[i].lchild = lnode; ht[i].rchild = rnode;
ht[lnode].parent = i; ht[rnode].parent = i;
}
}
void build_HC(HTNode ht[], HCode hcd[], int n){
int i, f, c;
HCode hc;
for (i = 0; i<n; i++) {
hc.length = 0; c = i;
f = ht[i].parent;
while (f != -1) {
if (ht[f].lchild == c) hc.code[hc.length++] = '0';
else hc.code[hc.length++] = '1';
c = f; f = ht[f].parent;
}
hc.code[hc.length] = 0;
reverse(hc.code, hc.code+hc.length);
hcd[i] = hc;
}
}
int main(){
cin >> str;
int len = 0;
for (int i = 0; str[i]; i++) {
int j;
for (j = 0; j<len; j++)
if (str[i] == ht[j].data)
break;
if (j<len) continue;
int count = 0;
for (j = 0; str[j]; j++) {
if (str[i] == str[j])
count++;
}
ht[len].data = str[i];
ht[len++].weight = count;
}
build_HT(ht, len);
build_HC(ht, hcd, len);
for (int i = 0; i<len; i++) {
cout << ht[i].data << ": " << hcd[i].code << endl;
}
return 0;
}