使用C++代码实现哈夫曼树的构造

简介: 使用C++代码实现哈夫曼树的构造

哈夫曼树是一种用于数据压缩的树形数据结构,其构造过程可以通过以下步骤实现:

 

1. 定义哈夫曼树的节点结构体,包括权重和指向左右子节点的指针。

2. 创建一个优先队列(最小堆),用于存储权重最小的节点。

3. 将所有权重作为单独的节点插入优先队列。

4. 重复以下步骤,直到只剩下一个节点为止:

     a. 从优先队列中取出两个权重最小的节点作为左右子节点。

     b. 创建一个新节点,权重为两个子节点的权重之和,将这个新节点插入优先队列。

5. 最终剩下的节点即为哈夫曼树的根节点。

 

以下是一个简单的 C++ 实现哈夫曼树构造的示例代码:

 

```cpp
#include <iostream>
#include <queue>
 
using namespace std;
 
struct Node {
    char data;
    int weight;
    Node* left;
    Node* right;
 
    Node(char data, int weight) : data(data), weight(weight), left(nullptr), right(nullptr) {}
};
 
struct Compare {
    bool operator()(Node* a, Node* b) {
        return a->weight > b->weight;
    }
};
 
Node* buildHuffmanTree(priority_queue<Node*, vector<Node*>, Compare>& pq) {
    while (pq.size() > 1) {
        Node* left = pq.top();
        pq.pop();
 
        Node* right = pq.top();
        pq.pop();
 
        Node* parent = new Node('$', left->weight + right->weight);
        parent->left = left;
        parent->right = right;
 
        pq.push(parent);
    }
 
    return pq.top();
}
 
void printCodes(Node* root, string code) {
    if (root == nullptr) {
        return;
    }
 
    if (root->data != '$') {
        cout << root->data << ": " << code << endl;
    }
 
    printCodes(root->left, code + "0");
    printCodes(root->right, code + "1");
}
 
int main() {
    priority_queue<Node*, vector<Node*>, Compare> pq;
 
    pq.push(new Node('a', 5));
    pq.push(new Node('b', 9));
    pq.push(new Node('c', 12));
    pq.push(new Node('d', 13));
    pq.push(new Node('e', 16));
    pq.push(new Node('f', 45));
 
    Node* root = buildHuffmanTree(pq);
 
    cout << "Huffman Codes are: " << endl;
    printCodes(root, "");
 
    return 0;
}
```

 

在这个示例中,我们定义了一个 `Node` 结构体表示哈夫曼树的节点,以及一个比较器 `Compare` 用于优先队列中节点的比较。然后我们实现了 `buildHuffmanTree` 函数来构建哈夫曼树,以及 `printCodes` 函数来打印哈夫曼编码。

 

`main` 函数中,我们创建了一个优先队列,并插入了一些示例数据。然后构建哈夫曼树,并打印出对应的哈夫曼编码。

 

这个示例展示了如何使用 C++ 实现哈夫曼树的构造过程。

相关文章
|
1天前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
1月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
61 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
3月前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
91 4
|
4月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
634 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
5月前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
|
5月前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
5月前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
5月前
|
前端开发 C++ Windows
C++生成QML代码与QML里面集成QWidget
这篇文章介绍了如何在C++中生成QML代码,以及如何在QML中集成QWidget,包括使用Qt Widgets嵌入到QML界面中的技术示例。
112 0
|
6月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
497 0
|
6月前
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
146 0