哈夫曼树编码输入根据用户的输入信息,建立二叉树的二叉列表。 利用递归和非递归实现二叉树的中序遍历,利用队列实现二叉树的层次遍历。 求所有叶子结点总数。 求该二叉树的高度。用C语言写
时间: 2024-11-17 08:28:38 浏览: 47
哈夫曼树编码是一种数据压缩算法,通过构建最优二叉树(最小带权路径长度)来表示输入的字符集。用户首先提供一组字符及其对应频率,然后通过贪心算法生成一棵特殊的二叉树。
对于二叉树的构建:
1. **输入**:用户输入字符及其频率,可以视为一个键值对的数组(如 `char ch[100], freq[100]`)。
2. **创建节点**:使用结构体表示节点,包含字符、频率和两个指向左右子节点的指针。
3. **构造哈夫曼树**:从频率最高的两个节点开始,合并成新的节点,将新节点的频率设置为两旧节点之和,以此类推,直到只剩下一个节点为止。
4. **存储树结构**:用链表或数组的形式保存每个节点的位置和与其相连的子节点。
**遍历二叉树**:
- **中序遍历(递归和非递归)**:
- 递归版:先左子树->访问当前节点->右子树。
- 非递归版(栈辅助):维护一个栈,入根节点,出栈后访问,遇到左子节点则压栈,右子节点则继续出栈。
- **层次遍历(队列辅助)**:
- 使用队列,初始放入根节点,每次出队,访问当前节点,再将其左右子节点加入队列,直至队列为空。
**统计任务**:
- **计算叶子结点总数**:遍历过程中,遇到没有子节点的节点就是叶子结点。
- **求树的高度**:非递归版本,记录当前最大深度,每次访问左子节点和右子节点时更新高度。
以下是简单的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 节点结构
typedef struct Node {
char data;
int freq;
struct Node* left, *right;
} Node;
// 创建新节点
Node* newNode(char data, int freq) {
// ...
}
// 构建哈夫曼树
Node* buildHuffmanTree(int n, char ch[], int freq[]) {
// ...
}
// 中序遍历
void inOrder(Node* node) {
if (node == NULL)
return;
inOrder(node->left);
printf("%c", node->data);
inOrder(node->right);
}
// 层次遍历
void levelOrder(Node* root) {
// 使用队列实现...
}
// 统计函数
int countLeaves(Node* root) {
// ...
}
int height(Node* root) {
// ...
}
int main() {
// 用户输入等...
Node* root = buildHuffmanTree(n, ch, freq);
inOrder(root);
printf("\n");
printf("Leaf nodes: %d\n", countLeaves(root));
printf("Height: %d\n", height(root));
free(root); //释放内存
return 0;
}
```
请注意,这只是一个基本框架,实际的代码实现需要填充细节,并处理错误情况。
阅读全文