使用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++ 实现哈夫曼树的构造过程。

相关文章
|
30天前
|
自然语言处理 算法 前端开发
C++与Doxygen:精通代码文档化之道
C++与Doxygen:精通代码文档化之道
49 0
|
1月前
|
自然语言处理 安全 C++
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
83 1
|
1月前
|
Linux 编译器 程序员
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
68 0
|
1月前
|
IDE Linux 开发工具
内存泄漏检测工具Valgrind:C++代码问题检测的利器(一)
内存泄漏检测工具Valgrind:C++代码问题检测的利器
87 0
|
1月前
|
安全 Linux 开发者
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
83 1
|
1天前
|
设计模式 编译器 数据安全/隐私保护
C++ 多级继承与多重继承:代码组织与灵活性的平衡
C++的多级和多重继承允许类从多个基类继承,促进代码重用和组织。优点包括代码效率和灵活性,但复杂性、菱形继承问题(导致命名冲突和歧义)以及对基类修改的脆弱性是潜在缺点。建议使用接口继承或组合来避免菱形继承。访问控制规则遵循公有、私有和受保护继承的原则。在使用这些继承形式时,需谨慎权衡优缺点。
12 1
|
3天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
3天前
|
C++
【C++】在使用代码组装URL时,一定要注意的坑......
【C++】在使用代码组装URL时,一定要注意的坑......
9 0
|
25天前
|
C语言 C++ 容器
C调用C++代码
C调用C++代码
12 1
|
30天前
|
算法 程序员 C语言
C++设计哲学:构建高效和灵活代码的艺术
C++设计哲学:构建高效和灵活代码的艺术
60 1