###### 霍夫曼编码

Description

Input

Output

Sample Input
Copy sample input to clipboard
10
S S U U U S U L U U

Sample Output
U 6 1
S 3 01
L 1 00


struct Node {
int value;    // 记录频率
char c;       // 记录字符
std::string code;   // 记录编码
Node* l;            // 左孩子
Node* r;            // 右孩子
Node(int num, int index) { };   //num为频率, index用来确定是那个字符
} *nodes[26];

if (root->l != NULL) {
root->l->code = root->code + "0";
dfs(root->l);
}同理确定右孩子的编码

#include <iostream>
#include <stack>
#include <algorithm>
#include <memory.h>

struct Node {
int value;
char c;
std::string code;
Node* l;
Node* r;
Node(int num, int index) {
value = num;
c = 'A' + index;
code = "";
l = r = NULL;
}
} *nodes[26];

bool com(Node* a, Node* b) {
return a->value > b->value;
}

void dfs(Node* root) {
if (root->l != NULL) {
root->l->code = root->code + "0";
dfs(root->l);
}
if (root->r != NULL) {
root->r->code = root->code + "1";
dfs(root->r);
}
}

int main()
{
int num;
std::cin >> num;
int arr[26];
memset(arr, 0, sizeof(arr));
char temp;
int count = 0;
for (int i = 0; i < num; ++i) {
std::cin >> temp;
if (arr[temp-'A'] == 0)
count++;
arr[temp-'A']++;
}
//std::cout << count << std::endl;
int index = 0;
for (int i = 0; i < 26; ++i) {
if (arr[i] > 0) {
nodes[index++] = new Node(arr[i], i);
}
}

std::stack<Node*> s;
while (count != 1) {
std::sort(nodes, nodes+count, com);
if (nodes[count-1]->l == NULL && nodes[count-1]->r == NULL)
s.push(nodes[count-1]);
if (nodes[count-2]->l == NULL && nodes[count-2]->r == NULL)
s.push(nodes[count-2]);
Node* father = new Node(nodes[count-1]->value + nodes[count-2]->value, 0);
father->l = nodes[count-1];
father->r = nodes[count-2];
nodes[count-2] = father;
count--;
}
//std::cout << count << std::endl;
dfs(nodes[0]);
//std::cout << "coding end" << std::endl;
while (!s.empty()) {
std::cout << s.top()->c << " " << s.top()->value << " " << s.top()->code << std::endl;
s.pop();
}
}

#### 霍夫曼编码霍夫曼编码霍夫曼编码

2011年07月06日 170KB 下载

#### C++实现:霍夫曼编码

2012-05-21 21:58:08

#### 霍夫曼编码的多种实现

2012-06-04 13:06:17

#### 有关霍夫曼编码的两个习题解答

2017-03-23 22:53:45

#### 霍夫曼编码c、c++

2010年07月12日 411KB 下载

#### 霍夫曼编码 C++ C#

2010年08月05日 297KB 下载

#### 用MATLAB做的基于霍夫曼编码的图像压缩

2009年08月16日 684KB 下载

#### 霍夫曼编码（Huffman Coding）

2016-09-22 21:44:16

#### 霍夫曼编码详解

2007-03-20 20:16:00

#### 霍夫曼编码的正常思维

2016-04-25 16:46:47