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

哈夫曼树的数据结构。

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;
}
相关推荐
phltxy4 小时前
C语言操作符详解
java·c语言·算法
aqiu1111115 小时前
【LeetCode 902】最大为 N 的数字组合 - 详细题解与数位组合思路
数据结构·算法·leetcode·蓝桥杯·数位dp
辰烨chenye6 小时前
LeetCode Hot 100 题解 · 哈希篇
算法·leetcode·哈希算法
罗西的思考6 小时前
DreamZero 与 DreamDojo:世界模型与策略的分层协同综合分析与对比
人工智能·算法·机器学习
玖玥拾7 小时前
LeetCode 219 存在重复元素 II
算法·leetcode·哈希算法·散列表
知无不研8 小时前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
a187927218319 小时前
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并
2601_962297489 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
辰烨chenye9 小时前
LeetCode Hot 100 题解 · 子串篇
算法·leetcode·职场和发展