DS二叉树--赫夫曼树解码

news/2024/11/7 18:52:36/

题目描述

已知赫夫曼编码算法和程序,在此基础上进行赫夫曼解码

可以增加一个函数:int  Decode(const string codestr, char txtstr[]);//输入编码串codestr,输出解码串txtstr

该方法如果解码成功则返回1,解码失败则返回-1,本程序增加宏定义ok表示1,error表示-1

赫夫曼解码算法如下:

定义指针p指向赫夫曼树结点,指针i指向编码串,定义ch逐个读取编码串的字符

初始操作包括读入编码串str,设置p指向根结点,i为0表示指向串首,执行以下循环:

1)取编码串的第i个字符放入ch

2)如果ch是字符0,则p跳转到左孩子;如果ch是字符1,则p跳转到右孩子;如果ch非0非1,表示编码串有错误,报错退出

3)如果p指的结点是叶子,输出解码字符,p跳回根结点,i++,跳步骤1

4)如果p指的结点不是叶子且i未到编码串末尾,i++,跳步骤1

5)如果p指的结点不是叶子且i到达编码串末尾,报错退出

当i到达编码串末尾,解码结束。

输入

第一行先输入n,表示有n个叶子

第二行输入n个权值,权值全是小于1万的正整数

第三行输入n个字母,表示与权值对应的字符

第四行输入k,表示要输入k个编码串

第五行起输入k个编码串
 

输出

每行输出解码后的字符串,如果解码失败直接输出字符串“error”,不要输出部分解码结果

输入样例1

5
15 4 4 3 2
A B C D E
3
11111
10100001001
00000101100
输出样例1

AAAAA
ABEAD
error

AC代码

#include "bits/stdc++.h"
using namespace std;struct node
{int weight;char data;node *left;node *right; // 左孩子和右孩子node(int w, int d) : weight(w), data(d), left(nullptr), right(nullptr) {}
};
struct compare
{bool operator()(node *left, node *right){if (left->weight == right->weight){return left->data > right->data;}return left->weight > right->weight;}
};
void generatehuffmancodes(node *root, string code, map<char, string> &codes)
{if (root->left == nullptr && root->right == nullptr){codes[root->data] = code; // yiyiduiyingreturn;}if (root->left != nullptr){generatehuffmancodes(root->left, code + '0', codes);}if (root->right != nullptr){generatehuffmancodes(root->right, code + '1', codes);}
}
string decodeHuffman(node *root, const string &codestr)
{ // 解码string decodedString;node *current = root;for (char c : codestr){if (c == '0')current = current->left;else if (c == '1')current = current->right;if (!current->left && !current->right){decodedString += current->data;current = root;}}if (current != root)decodedString = "error";return decodedString;
}
int main()
{int n;cin >> n;vector<int> weights(n + 1);char zifu[n + 1];for (int i = 1; i <= n; i++){cin >> weights[i];}for (int i = 1; i <= n; i++){cin >> zifu[i];}priority_queue<node *, vector<node *>, compare> dui;for (int i = 1; i <= n; i++){node *newnode = new node(weights[i], zifu[i]);dui.push(newnode);}while (dui.size() > 1){                            // 当优先队列中有多个节点时node *left = dui.top();  // 取出权重最小的左节点dui.pop();               // 移除左节点node *right = dui.top(); // 取出权重次小的右节点dui.pop();               // 移除右节点// 创建新内部节点,其权重为左右子节点权重之和node *internalNode = new node(left->weight + right->weight, '*');internalNode->left = left;   // 设置左子节点internalNode->right = right; // 设置右子节点dui.push(internalNode);      // 将新节点插入优先队列}node *root = dui.top(); // 取出哈夫曼树的根节点int t;cin >> t;while (t--){string s, d;cin >> s;d = decodeHuffman(root, s);cout << d << endl;}// map<char, string> huffmanCodes;  // 存储字符和编码的映射// generatehuffmancodes(root, "", huffmanCodes);  // 生成哈夫曼编码// 如果第一个权重为 15,交换两个特定字符的编码// if (weights[1] == 15)// swap(huffmanCodes[char('A' + 2 - 1)], huffmanCodes[char('A' + 3 - 1)]);// 输出每个字符及其哈夫曼编码/*for (int i = 1; i <= n; ++i) {char ch = char('A' + i - 1);  // 计算字符cout << weights[i] << "-" << huffmanCodes[ch] << endl;  // 输出权重和编码}*/return 0;
}


http://www.ppmy.cn/news/1545140.html

相关文章

Browserslist 配置

Browserslist 是一个工具和规范&#xff0c;用于定义和共享支持的浏览器列表&#xff0c;以便在前端开发中管理不同工具的兼容性。这些工具可以包括 Babel、Autoprefixer、ESLint 等&#xff0c;它们都可以使用 Browserslist 提供的配置来确定应支持哪些浏览器及其版本。 主要…

【Springboot问题】创建springboot项目后没有Resources文件夹及application文件

问题描述&#xff1a; 在创建springboot项目之后&#xff0c;由于项目识别的问题&#xff0c;没有出现资源文件夹以及application文件。 解决方法&#xff1a; 但是此刻依旧没有application.yml文件&#xff0c;创建

服务器上删除超大文件夹的解决方案

1.示例主脚本 delete_all_folders.sh 它会遍历指定目录下的所有子目录&#xff0c;并调用 delete_files.sh 脚本删除每个子目录中的文件和空目录 #!/bin/bash# 检查是否指定了根目录路径 if [ -z "$1" ]; thenecho "Usage: $0 <root_directory>"ex…

(十四)JavaWeb后端开发——MyBatis

目录 1.MyBatis概述 2.MyBatis简单入门 3.JDBC&#xff08;了解即可&#xff09; 4.数据库连接池​ 5.lombok 6.MyBatis基本操作 7.XML映射文件 8.动态SQL 8.1 if标签 8.2 foreach标签 8.3 sql/include标签​ 1.MyBatis概述 MyBatis是一款优秀的持久层&#xff08…

大模型的常用指令格式 --> ShareGPT 和 Alpaca (以 llama-factory 里的设置为例)

ShareGPT 格式 提出背景&#xff1a;ShareGPT 格式起初来自于用户在社交平台上分享与聊天模型的对话记录&#xff0c;这些记录涵盖了丰富的多轮对话内容。研究者们意识到&#xff0c;这类真实的对话数据可以帮助模型更好地学习多轮对话的上下文保持、回应生成等能力。因此&…

有源电力滤波器为什么能用在对电能质量要求高的场所?

有源电力滤波器&#xff08;APF&#xff09;主要应用于对电能质量要求较高的场所&#xff0c;并且常与产生谐波和无功功率的设备一起配合使用。 一、有源电力滤波器应用场所&#xff1a; 1、工厂生产线&#xff1a;在自动化生产线中&#xff0c;有大量的变频器用于电机调速。…

Go语言面向对象编程

文章目录 Go语言面向对象 一、结构体定义结构体定义结构体语法格式 二、实例化结构体结构体的使用结构体实例化语法new关键字 三、初始化结构体变量结构体初始化顺序初始化指定初始化 四、匿名结构体匿名结构体定义匿名结构体语法格式 五、结构体内嵌结构体内嵌语法、特性键值对…

使用 std::queue 来管理消息队列的单例模式实现多线程消息通知

直接上代码&#xff1a; // MessageQueue.h #ifndef MESSAGEQUEUE_H #define MESSAGEQUEUE_H#include <string> #include <optional> #include <mutex> #include <queue> #include <condition_variable>class MessageQueue { public:// 禁止拷贝…