数据结构树与二叉树(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.mfbz.cn/a/203034.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

switch....case击穿| return 和break的区别

1、我们首先要明白switch..case的语法使用&#xff1a; 执行流程&#xff1a;首先计算switch后面圆括号中表达式的值&#xff0c;然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句…

牛客剑指offer刷题模拟篇

文章目录 顺时针打印矩阵题目思路代码实现 顺时针打印矩阵 题目 描述 输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个数字&#xff0c;例如&#xff0c;如果输入如下4 X 4矩阵&#xff1a; [[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]] 则依次…

MGF4964BL-01 低噪声 InGaAs HEMT(高电子迁移率晶体管) K波段放大器 微X型塑料封装

MGF4964BL-01超低噪声 InGaAs HEMT(高电子迁移率晶体管)设计用于K波段放大器。MGF4964BL-01是符合 RoHS 标准的产品&#xff0c;通过无铅认证。 MGF4964BL-01特征&#xff1a; f20GHz NFmin 时的低噪声系数。0.65 分贝(典型值) f20GHz 时的高相关增益 Gs 13.5dB(典型值。) MG…

C#文件流二进制文件的读写

目录 一、BinaryWriter类 二、BinaryReader类 三、示例 1.源码 2.生成效果 二进制文件的写入与读取主要是通过BinaryWriter类和BinaryReader类来实现的。 一、BinaryWriter类 BinaryWriter类以二进制形式将基元类型写入流&#xff0c;并支持用特定的编码写入字符串&#…

【开源】基于JAVA的高校学生管理系统

项目编号&#xff1a; S 029 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S029&#xff0c;文末获取源码。} 项目编号&#xff1a;S029&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生管理模块2.2 学院课程模块2.3 学…

记录仿钉钉审批流(将MySQL换成Oracle)走过的坑

需求&#xff1a;实现审批流程 在Gitee上发现了一个功能还OK的项目&#xff0c;于是就clone下来了&#xff08;如下图&#xff09; 原项目用MySQL很好启动&#xff0c;B站上作者还录制了视频&#xff0c;可以去学习 这里主要记录将MySQL换成Oracle出现的问题 首先&#xff0c…

用java实现拼图小游戏

1、了解拼图游戏基本功能&#xff1a; 拼图游戏内容由若干小图像块组成的&#xff0c;通过鼠标点击图像块上下左右移动&#xff0c;完成图像的拼凑。 2、拼图游戏交互界面设计与开发&#xff1a; 通过创建窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 &#xff…

STM32通讯设计

STM32通讯设计 通讯流程STM32程序 通讯流程 1.使用HT2202芯片配置为主机接收&#xff08;轮询模式&#xff09;。 2.将STM32芯片配置为从机发送&#xff0c;中断模式下发送固定数据。 3.如果HT2202芯片能够收到STM32发送的数据则通讯成功&#xff0c;否则通讯失败。 STM32程序…

如何使用金狮视频助手合并两个视频?

如果您需要将两个或多个精彩的视频合并为一个视频&#xff0c;或者它们具有不同的视频格式想合并为一样的视频格式&#xff0c;那么您可以使用视频合并软件来完成。 金狮视频助手是一款合并视频的出色工具&#xff0c;可以在不更改原始文件的情况下合并各种格式的视频。您还可…

mongodb基本操作命令

mongodb快速搭建及使用 1.mongodb安装1.1 docker安装启动mongodb 2.mongo shell常用命令2.1 插入文档2.1.1 插入单个文档2.1.2 插入多个文档2.1.3 用脚本批量插入 2.2 查询文档2.2.1 排序查询2.2.1 分页查询 前言&#xff1a;本篇默认你是对nongodb的基础概念有了了解&#xff…

【Java学习笔记】 74 - 本章作业

1.验证电子邮件格式是否合法 规定电子邮件规则为 1.只能有一个 2. 前面是用户名,可以是a-z A-Z 0-9 _ - 字符 3. 后面是域名&#xff0c;并且域名只能是英文字母&#xff0c;比如sohu.com或者tsinghua.org.cn 4.写出对应的正则表达式&#xff0c;验证输入的字符串是否为满…

获取Spring容器Bean工具类

获取Spring容器Bean工具类 1、创建SpringUtils工具类2、注册 SpringUtils工具类3、如果打包的是War方式&#xff0c;可能上面两个注册工具类的方法都没用 1、创建SpringUtils工具类 public class SpringUtils implements ApplicationContextAware {private static Application…

【神经网络】AlexNet

来源 2012年在全球知名的图像识别竞赛 ILSVRC 中&#xff0c;AlexNet 横空出世&#xff0c;直接将错误率降低了近 10 个百分点&#xff0c;这是之前所有机器学习模型无法做到的。 网络结构 AlexNet整体的网络结构包括&#xff1a;1个输入层&#xff08;input layer&#xff…

基于深度学习的表情动作单元识别综述

论文标题&#xff1a;基于深度学习的表情动作单元识别综述 作者&#xff1a;邵志文1&#xff0c;2&#xff0c;周 勇1&#xff0c;2&#xff0c;谭 鑫3&#xff0c;马利庄3&#xff0c;4&#xff0c;刘 兵1&#xff0c;2&#xff0c;姚 睿1&#xff0c;2 发表日期&#xff1a…

Docker 下载加速

文章目录 方式1&#xff1a;使用 网易数帆容器镜像仓库进行下载。方式2&#xff1a;配置阿里云加速。方式3&#xff1a;方式4&#xff1a;结尾注意 Docker下载加速的原理是&#xff0c;在拉取镜像时使用一个国内的镜像站点&#xff0c;该站点已经缓存了各个版本的官方 Docker 镜…

【攻防世界-misc】CatCatCat

1.下载附件并解压至桌面&#xff0c; 包含一张图片&#xff0c;一个txt文件&#xff0c;将图片复制到kali桌面上&#xff0c;使用strings命令查看该图片内容是否包含flag字符&#xff0c;得到的内容是密码为&#xff1a;catflag 在查看txt文件时&#xff0c;可以看到在文件名命…

Linux常用基础命令及重要目录,配置文件功能介绍

目录 一&#xff0c;Linux常用必备基础命令 1&#xff0c;网络类命令 2&#xff0c;文件目录类命令 3&#xff0c;操作类命令 4&#xff0c;关机重启命令 5&#xff0c;帮助命令 6&#xff0c;查看显示类命令 7&#xff0c;命令常用快捷键 二&#xff0c;Linux重要目录…

论文阅读——SEEM

arxiv: 分割模型向比较灵活的分割的趋势的转变&#xff1a;封闭到开放&#xff0c;通用到特定、one-shot到交互式。From closed-set to open-vocabulary segmentation&#xff0c;From generic to referring segmentation&#xff0c;From one-shot to interactive segmentati…

手敲myarraylist,深入了解其运行逻辑

1、自定义MyArrayList类 该类里面基本有两个属性&#xff0c;一个是用来存放数据的数组&#xff0c;另外一个是用来描述已经存放数据的数量。同时设置arraylist表的默认长度为10&#xff1b;代码如下&#xff1a; public class MyArrayList {private int[] elem;private int u…

【HTML】VScode不打开浏览器实时预览html

1. 问题描述 预览HTML时&#xff0c;不想打开浏览器&#xff0c;想在VScode中直接实时预览 2. 解决方案 下载Microsoft官方的Live Preview 点击预览按钮即可预览
最新文章