用c语言写 有一电文共使用五种字符A,B,C,D,E,其出现频率依次为4,7,5,2,9。构造对应的编码哈夫曼树(要求左子树根结点的权小于等于右子树根结点的权),并输出个字符的编码
时间: 2024-09-20 12:03:41 浏览: 61
C语言中把数字转换为字符串-sprintf
在C语言中,我们可以使用哈夫曼编码(Huffman Coding)算法来构建哈夫曼树。哈夫曼树是一种带权重的二叉树,其中叶子节点代表字符,路径上每个边的权重对应字符出现的概率。以下是步骤:
1. 首先,创建一个结构体存储字符及其出现的频率(权值),例如:
```c
typedef struct {
char ch;
int freq;
} Node;
```
2. 创建一个优先队列(最小堆),将所有节点插入:
```c
Node freqList[] = { {'A', 4}, {'B', 7}, {'C', 5}, {'D', 2}, {'E', 9} };
int numNodes = sizeof(freqList) / sizeof(freqList[0]);
PriorityQueue<Node> huffTree(numNodes);
for (int i = 0; i < numNodes; i++) {
huffTree.push(freqList[i]);
}
```
3. 从队列中取出两个频率最低的节点,合并成一个新的节点,新节点的频率是两者的和,并设置左子节点和右子节点指向原来的节点:
```c
while (huffTree.size() > 1) {
Node left = huffTree.pop();
Node right = huffTree.pop();
Node newNode = { '\0', left.freq + right.freq };
newNode.left = left;
newNode.right = right;
huffTree.push(newNode);
}
```
4. 最后队列中剩下的就是根节点,它代表了新的编码规则。遍历树,输出每个字符及其编码。由于是哈夫曼树,可以发现编码通常是一个二进制序列,左分支表示"0",右分支表示"1":
```c
Node root = huffTree.top();
void printCodes(Node node, char code) {
if (node == nullptr) return;
printCodes(node.left, code + '0');
printf("%c", node.ch); // 输出当前字符
printCodes(node.right, code + '1');
}
printCodes(root, "");
```
注意:`PriorityQueue` 和 `Node` 结构可能需要自行实现。
阅读全文