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;}