构造哈夫曼树的步骤是什么样的_构造哈夫曼树的步骤是什么样的

构造哈夫曼树的步骤是什么样的_构造哈夫曼树的步骤是什么样的数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!哈夫曼树是一种特殊的二叉树,它的叶子节点对应着要编码的字符,而非叶子节点则对应着编码。哈夫曼树的构建过程是基于贪心策略的,即每次选取出现频率最小的两个节点,将它们合并成一个新节点,直到

数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!   哈夫曼树是一种特殊的二叉树,它的叶子节点对应着要编码的字符,而非叶子节点则对应着编码。哈夫曼树的构建过程是基于贪心策略的,即每次选取出现频率最小的两个节点,将它们合并成一个新节点,直到最后形成一棵哈夫曼树。以下是一个 C++ 的实现:   “`c++   #include <iostream>   #include <queue>   #include <vector>   using namespace std;   // 定义哈夫曼树节点结构体   struct TreeNode {   char data; // 节点存储的字符   int freq; // 节点对应字符出现的频率   TreeNode* left; // 左子节点   TreeNode* right; // 右子节点   TreeNode(char data, int freq) : data(data), freq(freq), left(nullptr), right(nullptr) {}   };   // 定义比较函数,用于优先队列的排序   struct cmp {   bool operator()(TreeNode* a, TreeNode* b) {   return a->freq > b->freq; // 频率小的节点优先级高   }   };   // 构建哈夫曼树的函数   TreeNode* buildHuffmanTree(vector<char>& chars, vector<int>& freqs) {   priority_queue<TreeNode*, vector<TreeNode*>, cmp> pq; // 定义优先队列   for (int i = 0; i < chars.size(); i++) {   TreeNode* node = new TreeNode(chars[i], freqs[i]); // 创建节点,存储字符和频率   pq.push(node); // 将节点加入到优先队列中   }   while (pq.size() > 1) { // 只要队列中还有两个及以上的节点   TreeNode* left = pq.top(); // 取出频率最小的节点   pq.pop();   TreeNode* right = pq.top(); // 取出频率次小的节点   pq.pop();   TreeNode* parent = new TreeNode(‘$’, left->freq + right->freq); // 新建一个父节点   parent->left = left; // 将左子节点挂到父节点下面   parent->right = right; // 将右子节点挂到父节点下面   pq.push(parent); // 将新建的父节点加入到队列中   }   return pq.top(); // 队列中最后剩下的节点即为根节点   }   // 递归打印哈夫曼树的编码   void printHuffmanCode(TreeNode* root, string code) {   if (!root) return; // 递归结束条件   if (root->data != ‘$’) { // 如果是叶子节点,输出对应字符和编码   cout << root->data << ” ” << code << endl;   }   printHuffmanCode(root->left, code + “0”); // 递归处理左子树   printHuffmanCode(root->right, code + “1”); // 递归处理右子树   }   int main() {   vector<char> chars = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’};   vector<int> freqs = {5, 9, 12, 13, 16, 45};   TreeNode* root = buildHuffmanTree(chars, freqs);   printHuffmanCode(root, “”);   return 0;   }   “`   输出结果:   “`   f 0   c 100   d 101   a 1100   b 1101   e 111   “`   以上代码中,`buildHuffmanTree` 函数用于构建哈夫曼树,它使用了优先队列(堆)来维护频率最小的两个节点,不断合并成为新的节点,直到最后形成一棵哈夫曼树。`printHuffmanCode` 函数用于递归打印哈夫曼树的编码,其中传入的 `code` 参数表示当前节点的编码。

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/49726.html

(0)
上一篇 2024年 9月 3日
下一篇 2024年 9月 3日

相关推荐

关注微信