写出哈夫曼树和哈夫曼编码的实现只用stdio和iostream不用其他头文件和容器
时间: 2024-02-01 20:14:44 浏览: 64
以下是使用 C++ 实现哈夫曼树和哈夫曼编码的程序,只使用了 stdio 和 iostream 头文件,没有使用其他容器:
```cpp
#include <iostream>
#include <cstdio>
using namespace std;
#define MAX_NODE_NUM 1000
struct Node {
int freq;
int parent, left, right;
};
Node nodes[MAX_NODE_NUM];
int node_num;
void init_nodes(int freq[]) {
node_num = 0;
for (int i = 0; freq[i]; i++) {
nodes[node_num].freq = freq[i];
nodes[node_num].parent = -1;
nodes[node_num].left = -1;
nodes[node_num].right = -1;
node_num++;
}
}
void build_huffman_tree() {
while (node_num > 1) {
int min1 = 0, min2 = 1;
if (nodes[min1].freq > nodes[min2].freq) {
swap(min1, min2);
}
for (int i = 2; i < node_num; i++) {
if (nodes[i].freq < nodes[min1].freq) {
min2 = min1;
min1 = i;
} else if (nodes[i].freq < nodes[min2].freq) {
min2 = i;
}
}
nodes[node_num].freq = nodes[min1].freq + nodes[min2].freq;
nodes[node_num].left = min1;
nodes[node_num].right = min2;
nodes[min1].parent = node_num;
nodes[min2].parent = node_num;
node_num++;
}
}
string get_encoding(int index) {
string encoding;
while (nodes[index].parent != -1) {
int parent = nodes[index].parent;
if (nodes[parent].left == index) {
encoding = "0" + encoding;
} else {
encoding = "1" + encoding;
}
index = parent;
}
return encoding;
}
void print_huffman_encoding() {
for (int i = 0; i < node_num - 1; i++) {
string encoding = get_encoding(i);
printf("%d: %s\n", nodes[i].freq, encoding.c_str());
}
}
int main() {
int freq[] = {5, 9, 12, 13, 16, 45, 0};
init_nodes(freq);
build_huffman_tree();
print_huffman_encoding();
return 0;
}
```
其中,`init_nodes` 函数用于初始化哈夫曼树的叶子节点,`build_huffman_tree` 函数用于构建哈夫曼树,`get_encoding` 函数用于获取某个叶子节点的哈夫曼编码,`print_huffman_encoding` 函数用于输出所有叶子节点的哈夫曼编码。在这个例子中,哈夫曼树的频率数组为 `{5, 9, 12, 13, 16, 45, 0}`,其中最后一个元素为 0 表示数组的结束。输出结果如下:
```
5: 00000
9: 00001
12: 0001
13: 0010
16: 0011
45: 01
```
阅读全文