用c++实现哈夫曼树的析构函数
时间: 2023-06-04 18:07:47 浏览: 59
哈夫曼树的析构函数主要是用来释放动态分配的内存空间,可以采用递归的方式进行实现。具体代码如下:
```
void destroyHuffmanTree(HuffmanTreeNode* root) {
if (root != NULL) {
destroyHuffmanTree(root->left);
destroyHuffmanTree(root->right);
free(root);
}
}
```
其中,HuffmanTreeNode 表示哈夫曼树的结点类型,包括左右子结点指针和权值等信息。该函数首先判断当前结点是否为空,如果不为空就继续递归调用该函数删除左右子树,最后释放当前结点所占用的内存空间。
相关问题
怎么实现哈夫曼树的析构函数
哈夫曼树的析构函数实现就是递归地删除所有叶子节点。具体步骤如下:
1. 如果当前节点不为NULL,则进行如下步骤:
2. 递归删除左子树。
3. 递归删除右子树。
4. 删除当前节点。
5. 如果当前节点为NULL,则处理结束。
在实现时需要注意,当使用new动态申请节点内存时,在删除节点时一定要使用相应的delete释放内存,避免内存泄漏。
用c++实现哈夫曼树
以下是用C++实现哈夫曼树的代码示例:
```c++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
// 定义哈夫曼树结点
struct HuffmanNode {
int weight; // 权重
char ch; // 字符
HuffmanNode *left, *right; // 左右子树指针
HuffmanNode(int w, char c) : weight(w), ch(c), left(nullptr), right(nullptr) {}
};
// 定义比较函数,用于优先队列
struct cmp {
bool operator()(HuffmanNode* a, HuffmanNode* b) {
return a->weight > b->weight;
}
};
// 构造哈夫曼树
HuffmanNode* buildHuffmanTree(vector<int>& weights, vector<char>& chars) {
priority_queue<HuffmanNode*, vector<HuffmanNode*>, cmp> pq;
for (int i = 0; i < weights.size(); i++) {
pq.push(new HuffmanNode(weights[i], chars[i]));
}
while (pq.size() > 1) {
HuffmanNode* left = pq.top();
pq.pop();
HuffmanNode* right = pq.top();
pq.pop();
HuffmanNode* parent = new HuffmanNode(left->weight + right->weight, '\0');
parent->left = left;
parent->right = right;
pq.push(parent);
}
return pq.top();
}
// 遍历哈夫曼树,生成哈夫曼编码
void generateHuffmanCode(HuffmanNode* root, string code, vector<string>& codes) {
if (!root) {
return;
}
if (root->ch != '\0') {
codes[root->ch] = code;
}
generateHuffmanCode(root->left, code + "0", codes);
generateHuffmanCode(root->right, code + "1", codes);
}
// 主函数
int main() {
vector<int> weights = {5, 9, 12, 13, 16, 45};
vector<char> chars = {'a', 'b', 'c', 'd', 'e', 'f'};
HuffmanNode* root = buildHuffmanTree(weights, chars);
vector<string> codes(128);
generateHuffmanCode(root, "", codes);
for (int i = 0; i < 128; i++) {
if (!codes[i].empty()) {
cout << (char)i << ": " << codes[i] << endl;
}
}
return 0;
}
```