huffman
来源:互联网 发布:大脚插件 for mac 编辑:程序博客网 时间:2024/05/16 19:20
#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;}