【数据结构与算法】哈夫曼树,哈夫曼编码 详解

哈夫曼树的数据结构。

cpp 复制代码
struct TreeNode {
	ElemType data;
	TreeNode *left, *right;
};
using HuffmanTree = TreeNode *;

结构体包含三个成员:

  • data 是一个 ElemType 类型的变量,用于存储哈夫曼树节点的数据。
  • left 是一个指向 TreeNode 类型的指针,用于指向哈夫曼树节点的左子节点。
  • right 是一个指向 TreeNode 类型的指针,用于指向哈夫曼树节点的右子节点。

Huffman树能够解决的问题是什么?

Huffman树,也称为Huffman编码树,主要用于数据压缩和编码。它可以解决如何以最短的方式来表示一组数据的问题,使得整体数据的存储或传输更加高效。

如何构造Huffman树?

  1. 根据给定的n个权值{w1,w2,......wn},构造n 棵二叉树的集合F={T1,T2,......,Tn},其中每棵二叉树Ti 中只有一个带权为wi 的根结点,其左右子树均为空。
  2. 在森林F中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。
  3. 在森林中删除这两棵树,同时将新得到的二叉树加入森林中。
  4. 重复上述2和3两步直到只含一棵树为止,这棵树即哈夫曼树。
cpp 复制代码
TreeNode *createTreeNode(ElemType e, TreeNode *l, TreeNode *r) {
	TreeNode *t = (TreeNode *)malloc(sizeof(TreeNode));
	if (!t) {
		return NULL;
	}
	t->data = e;
	t->left = l;
	t->right = r;
	return t;
}

HuffmanTree createHuffmanTree(int n, ElemType *a, int *f) {
	priority_queue<Node> hmin;
	for (int i = 0; i < n; i++) {
		TreeNode *t = createTreeNode(a[i], nullptr, nullptr);
		hmin.push({f[i], t});
	}
	while (hmin.size() > 1) {
		Node a = hmin.top();
		hmin.pop();
		Node b = hmin.top();
		hmin.pop();
		if (a.f > b.f) {
			swap(a, b);
		}
		TreeNode *t = createTreeNode(' ', a.node, b.node);
		// cout << a.f << " " << b.f << endl;
		hmin.push({a.f + b.f, t});
	}
	return hmin.top().node;
}
相关推荐
GreenTea4 小时前
vLLM 与 SGLang KV Cache 底层实现机制深度调研报告
前端·后端·算法
Bode_20025 小时前
多资源规划(含生产调度、库存管理及产能规划)的创新优化算法
算法·调度
Logic1015 小时前
C语言/数据结构位运算题解:异或XOR找出蛋糕订单中的“VIP独特口味“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
土司大王5 小时前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode
微三云生态系统架构师-彭丹6 小时前
远方好物S2B2C系统架构:一级分销与保证金托管的合规技术实现
人工智能·算法
土司大王6 小时前
LeetCode hot100——34.在排序数组中查找元素的第一个和最后一个位置:Java 二分模板、边界分析
java·算法·leetcode
Logic1016 小时前
C语言/数据结构位运算题解:异或XOR找出飞行棋中的“独特颜色棋子“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
爱吃苹果的日记本7 小时前
数据结构第三课(时间复杂度)
数据结构·学习
罗西的思考7 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习
Logic1018 小时前
C语言/数据动态规划题解:翻转一次子数组后的最大子数组和——四状态DP(O(n)时间O(1)空间)
c语言·数据结构·动态规划·时间复杂度·算法题·状态机dp·最大子数组和