数据结构树与二叉树(5)Huffman树

#include <iostream>
#include <stack>
#include <queue>using namespace std;struct Node {char name=' ';int code[200];int num = 0;//code的下标int weight = 0;//权重(次数)Node* lchild;//左孩子Node* rchild;//右孩子Node* parent;Node* rparent;Node* lparent;Node() {}Node(char c, Node* lc = nullptr, Node* t = nullptr) {name = c;lchild = rchild = t;parent = rparent = lparent = t;}Node(int n, Node* lc = nullptr, Node* t = nullptr) {weight = n;lchild = rchild = t;parent = rparent = lparent = t;}
};void sort(Node** arr, int n) {//排序for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 1 - i; j++) {if (arr[j]->weight <= arr[j + 1]->weight) {Node* t = arr[j];arr[j] = arr[j + 1];arr[j + 1] = t;}}}
}Node* solve(Node** arr, int len) {Node* parent = nullptr;while (len != 0) {sort(arr, len);Node* first = arr[len-1];Node* second = arr[len-2];len -= 2;parent = new Node(first->weight + second->weight);parent->lchild = first;parent->rchild = second;first->parent = second->parent = parent;first->rparent = second->lparent = parent;if (len == 0)return parent;arr[len] = parent;len++;}return nullptr;
}void seekCode(Node* tree, char c) {queue<Node*> q;q.push(tree);while (!q.empty()) {Node* t = q.front();q.pop();if (t->name == c) {//找到Node* t1 = t;Node* t2 = t1->parent;while (t2 != nullptr) {//判断父子关系if (t2->lchild == t1 && t1->rparent == t2 ) t->code[t->num] = 0;else t->code[t->num] = 1;t->num++;t1 = t2;t2 = t1->parent;}break;}if(t->lchild != nullptr)q.push(t->lchild);if(t->rchild != nullptr)q.push(t->rchild);}
}int main() {int n;int len = 0;//代表元素的个数cin >> n;char c;Node** arr = new Node*[10000];Node** temp = new Node*[10000];//-------------得到每个字母出现的次数for (int i = 0; i < n; i++) {cin >> c;int flag = 0;for (int j = 0; j < len; j++) {if (arr[j]->name == c) {flag = 1;arr[j]->weight++;break;}}if (!flag) {arr[len] = new Node(c);arr[len]->weight++;len++;}}//---------------备用sort(arr, len);for (int i = 0; i < len; i++)temp[i] = arr[i];//----------------构建哈夫曼树Node* tree = solve(arr, len);for (int i = 0; i < len; i++)seekCode(tree, temp[i]->name);for (int i = 0; i < len; i++) {cout << temp[i]->name << " " << temp[i]->weight << " ";for (int j = temp[i]->num-1 ; j >= 0; j--)cout << temp[i]->code[j];cout << endl;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/231662.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二.运算符

运算符 1.算术运算符2.比较运算符3.逻辑运算符 1.算术运算符 算数运算符主要用于数学运算&#xff0c;其可以连接运算符前后的两个数值或表达式&#xff0c;对数值或表达式进行 - * / 和 取模%运算 1.加减法运算符 mysql> SELECT 100,100 0,100 - 0,100 50,100 50 - …

Unity引擎:创造无限可能的游戏开发平台

Unity引擎&#xff1a;创造无限可能的游戏开发平台 一、Unity引擎概述1.1 什么是Unity引擎&#xff1f;1.2 Unity引擎的特点和优势 二、Unity开发环境和工具2.1 Unity编辑器2.2 支持的平台2.3 脚本语言2.4 图形和音频工具 三、Unity游戏开发流程四、示例应用场景五、结论&#…

【知识】稀疏矩阵是否比密集矩阵更高效?

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 问题提出 有些地方说&#xff0c;稀疏图比密集图的计算效率更高&#xff0c;真的吗&#xff1f; 原因猜想 这里的效率高&#xff0c;应该是有前提的&#xff1a;当使用稀疏矩阵的存储格式(如CSR)时&#xff0c;计…

Message全局提示(antd-design组件库)简单用法

1.Message全局提示 全局展示操作反馈信息。 2.何时使用 可提供成功、警告和错误等反馈信息。 顶部居中显示并自动消失&#xff0c;是一种不打断用户操作的轻量级提示方式。 组件代码来自&#xff1a; 全局提示 Message - Ant Design 3.本地验证前的准备 参考文章【react项目ant…

L298N模块使用简介

接口作用ENA/ENB使用PWM调节马达转速&#xff08;调速&#xff09;左边一对接口接电机的正负极右边一对接口接电机正负极控制IN1,IN2 控制左边的2个接口的电压&#xff0c;IN1控制一个&#xff0c;IN2控制另外一个 IN1输入3.3V时&#xff0c;OUT1输出3.3v电压&#xff08;可能是…

vue3跟vue2的区别?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3和vue2的区别 目录 一、Vue3介绍 哪些变化 速度更快 体积更小 更易维护 compositon Api …

开发知识点-Maven包管理工具

Maven包管理工具 SpringBootSpringSecuritydubbo图书电商后台实战-环境设置&#xff08;JDK8, STS, Maven, Spring IO, Springboot&#xff09;点餐小程序Java版本的选择和maven仓库的配置视频管理系统&&使用maven-tomcat7插件运行web工程SpringTool suite——maven项目…

【C语言】把歌词里的播放时间跟歌词提取出来

一&#xff0c;介绍 给到一个字符串&#xff0c;里面包含了时间&#xff08;唱该歌词的时间以及该歌词&#xff09;例如“[02:16.33][04:11.44][05:11.44]我想大声宣布对你依依不舍”&#xff0c;如何把两者都给打印出来呢&#xff1f;下面给出解释 二&#xff0c;代码 #incl…

【Spring系列】DeferredResult异步处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Opencv 极坐标变换

变换后图片 代码 // 以Center为极坐标原点&#xff0c;将RowFrom到RowTo的圆环&#xff0c;仅仅变换该范围内的点&#xff0c;忽略掉其他部分。 #include "polar_transeforme.hpp" #include <string>using namespace cv;void calculate_map(int rouFrom, int …

错误 LNK2001 无法解析的外部符号 __imp__CrtDbgReport

”属性“ -->”设置“ --> ”c“ – > ”代码生成“ --> ”运行库“ &#xff0c;将 ”多线程(MT)“ 改为 ”多线程(MTD)“。

CSS核心功能手册:从熟悉到精通

CSS核心功能代码 文章目录 CSS核心功能代码[toc]参考HTML代码尺寸操作设置元素尺寸内边距外边距设置默认布局边距用途和使用场景&#xff1a; 背景设置**背景颜色 (background-color)**:**背景图像 (background-image)**:**背景重复 (background-repeat)**:**背景位置 (backgro…