void HuffmanTree::Initialization(char keys[], float w[], int n)//初始化哈夫曼树 { MyHeap<huffmannode> hp; huffmannode* parent = 0, * first, * second, * work, temp; for (int i = 0; i < n; i++)//逐个插入最小堆 { work = new huffmannode(); work->leftchild = 0; work->rightchild = 0; work->parent = work; work->key = keys[i]; work->times = w[i]; hp.Insert(*work); } //执行n-1次操作,以建立哈夫曼树 for (int i = 1; i <= n - 1; i++) { hp.Remove(temp); first = temp.parent; hp.Remove(temp); second = temp.parent; mergetree(first, second, parent);//合并 hp.Insert(*parent);//新节点插入堆中 } root = parent; }的作用
时间: 2023-06-16 09:07:51 浏览: 63
该函数的作用是利用哈夫曼编码的算法构建哈夫曼树。其中,keys[] 数组存储了每个节点的字符值,w[] 数组存储了每个节点的权重值(即出现次数),n 表示节点的数量。该函数使用最小堆来实现节点的插入和删除操作。首先将所有节点按权重值插入到最小堆中。然后,执行 n-1 次操作,每次从最小堆中取出两个权重值最小的节点,将它们合并成一个新的父节点,并将该父节点插入到最小堆中。最后,最后剩下的那个节点就是哈夫曼树的根节点。
相关问题
对以下代码进行细致注释#pragma once #include <map> #include <iomanip> //哈夫曼树存储结构 struct HuffmanNode { int weight; //结点字符和权值 int parent, lchild, rchild; }; class Huffman { private: map<char, int> code; map<string, char> sc_code; map<char, string> cs_code; const int MAXWEIGHT = 2147483647; HuffmanNode* hf = NULL; int N = 0; public: //无参构造 Huffman(); //初始化 void Initialization(); //选择 void select(HuffmanNode*& hf, int n, int& s1, int& s2); //创建Huffman树 void createHuffmanTree(HuffmanNode*& hf, int n); //Huffman编码实现 char** createHuffmanCode(HuffmanNode*& hf, int n); //编码 void Encoding(); //译码 void Decoding(); //印代码文件 void Print(); //印哈夫曼树 void TreePrinting(); };
// 防止头文件重复引用
#pragma once
// 使用map需要引入的头文件
#include <map>
// 用于输出格式化的头文件
#include <iomanip>
// 定义哈夫曼树的结构体
struct HuffmanNode {
int weight; // 结点字符和权值
int parent, lchild, rchild; // 结点父节点、左孩子节点和右孩子节点
};
// 定义哈夫曼编码的类
class Huffman {
private:
// 原始字符 -> 权值的映射
map<char, int> code;
// 压缩后的二进制位 -> 原始字符的映射
map<string, char> sc_code;
// 原始字符 -> 压缩后的二进制位的映射
map<char, string> cs_code;
// 定义最大权值
const int MAXWEIGHT = 2147483647;
// 定义哈夫曼树的指针
HuffmanNode* hf = NULL;
// 定义哈夫曼树的结点数目
int N = 0;
public:
// 无参构造函数
Huffman();
// 初始化哈夫曼编码
void Initialization();
// 选择权值最小的两个结点
void select(HuffmanNode*& hf, int n, int& s1, int& s2);
// 创建哈夫曼树
void createHuffmanTree(HuffmanNode*& hf, int n);
// 实现哈夫曼编码
char** createHuffmanCode(HuffmanNode*& hf, int n);
// 编码
void Encoding();
// 译码
void Decoding();
// 输出压缩后的代码文件
void Print();
// 输出哈夫曼树的结构
void TreePrinting();
};
typedef struct { char data; float weight;//权重 int lchild, rchild, parent; } node; //静态三叉链表 int nums = 0; typedef node huffman[M]; //哈夫曼树 用C++读写huffman数组
在 C++ 中,可以通过定义一个结构体来表示哈夫曼树中的节点,然后使用一个数组来存储这些节点,从而实现静态三叉链表。具体的代码如下:
```
#include <iostream>
using namespace std;
const int M = 100; // 哈夫曼树的最大节点数
struct node {
char data;
float weight;
int lchild, rchild, parent;
};
typedef node huffman[M]; // 定义哈夫曼树的类型
int nums = 0; // 当前哈夫曼树中节点的数量
int main() {
huffman tree; // 定义一个哈夫曼树
// 在这里可以对哈夫曼树进行构建、遍历等操作
return 0;
}
```
需要注意的是,这里的结构体中包含了一个 `parent` 字段,表示该节点的父节点在数组中的下标。在构建哈夫曼树时,可以通过该字段来进行父节点的查找和更新。同时,`lchild` 和 `rchild` 字段分别表示该节点的左子节点和右子节点在数组中的下标,如果该节点是叶子节点,则这两个字段都为 -1。