#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 1010;
int n = 0;
int key[maxn];
int code[maxn];
int index = 0;
typedef struct node {
int bit;
int value;
node *lchild, *rchild;
node *self;
node() {
bit = 0; value=0; lchild=NULL; rchild = NULL; self = NULL;
}
bool operator < (const node &a) const {
return a.value < value;
}
}node;
priority_queue<node> que;
node* newnode() {
node* tmp = (node*)malloc(sizeof(node));
tmp->bit = -1;
tmp->value = 0;
tmp->lchild = NULL;
tmp->rchild = NULL;
tmp->self = NULL;
return tmp;
}
int init() {
index = 0;
node* now = NULL;
for (int i = 0; i < n; i++) {
scanf("%d", &key[i]);
now = newnode();
now->lchild = NULL;
now->rchild = NULL;
now->bit = -1;
now->self = now;
now->value = key[i];
que.push(*now);
}
return 0;
}
node* halfman() {
node a, b;
node* now = NULL;
while (!que.empty()) {
bool ok = false;
if (!que.empty()) {
a = que.top();
que.pop();
}
if (!que.empty()) {
b = que.top();
que.pop();
ok = true;
}
if (!ok) {
break;
}
now = newnode();
a.self->bit = 0;
b.self->bit = 1;
now->lchild = a.self;
now->rchild = b.self;
now->value = a.value+b.value;
now->self = now;
que.push(*now);
}
return now;
}
int dfs(node* now) {
if (!now) {
return 0;
}
if (!now->lchild && !now->rchild) {
if (now->bit != -1) {
code[++index] = now->bit;
}
for (int i = 1; i <= index; i++) {
printf("%d", code[i]);
}
--index;
printf("\n");
return 0;
}
if (now->bit != -1) {
code[++index] = now->bit;
}
dfs(now->lchild);
dfs(now->rchild);
--index;
return 0;
}
int work() {
node* root = halfman();
dfs(root);
return 0;
}
int main()
{
while (1 == scanf("%d", &n)) {
init();
work();
}
return 0;
}
huffman
最新推荐文章于 2022-05-18 14:32:21 发布