哈夫曼树c语言版
一、哈夫曼树概念
哈夫曼树又称最优树给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
例给定一个有序数组{3,5,6,9,10},构造出一个哈夫曼树如下:

树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL
WPL = (3+5)*4 + 6*3 + 9*2 +10*1 = 98
二、实现代码
1、定义树结点
typedef struct huffmantreenode
{int* data;struct huffmantreenode* leftNode;struct huffmantreenode* rightNode;
} HuffmanTree;
2、声明函数操作
/***创建节点
*/
HuffmanTree* create_huffman_tree(int data);/*** 初始化哈夫曼根节点
*/
HuffmanTree* create_huffman_tree_root(int first,int second);/*** 新增节点
*/
void insert_huffmantree_node(HuffmanTree** tree,int data);/*** 前序遍历
*/
void pre_oder_huffmantree(HuffmanTree** tree);/*** 销毁树
*/
void destroy_huffmantree(HuffmanTree* tree);
3、函数定义
HuffmanTree* create_huffman_tree(int data)
{HuffmanTree* node = malloc(sizeof(HuffmanTree*));if(node==NULL){perror("节点点申请内存失败");return NULL;}node->data = malloc(sizeof(int*));*(node->data) = data;node->leftNode = NULL;node->rightNode = NULL;return node;
}HuffmanTree* create_huffman_tree_root(int first,int second)
{HuffmanTree* firstNode = create_huffman_tree(first);HuffmanTree* secondNode = create_huffman_tree(second);HuffmanTree* root = create_huffman_tree(first+second);root->leftNode = firstNode;root->rightNode = secondNode;return root;
}void insert_huffmantree_node(HuffmanTree** tree,int data)
{HuffmanTree* root = *tree;if(root==NULL){perror("初始结点为空");return;}int rootData = *(root->data);HuffmanTree* node = create_huffman_tree(data); HuffmanTree* newRoot = create_huffman_tree(data+rootData); bool isLeft = rootData<data;newRoot->leftNode = isLeft?root:node;newRoot->rightNode = isLeft?node:root;*tree = newRoot;
}void pre_oder_huffmantree(HuffmanTree** tree)
{HuffmanTree* curNode = *tree;if(curNode==NULL){return;}printf("前序遍历sort=%d\n",*(curNode->data));pre_oder_huffmantree(&(curNode->leftNode));pre_oder_huffmantree(&(curNode->rightNode));
}void destroy_huffmantree(HuffmanTree* tree)
{if(tree==NULL){return;}destroy_huffmantree(tree->leftNode);destroy_huffmantree(tree->rightNode);free(tree);
}
4、测试函数
void test_huffmantree()
{int arr[] = {3,5,6,9,10};HuffmanTree* root = create_huffman_tree_root(arr[0],arr[1]);int i = 2;for(;i<5;i++){insert_huffmantree_node(&root,arr[i]);}pre_oder_huffmantree(&root);destroy_huffmantree(root);
}

相关文章:
哈夫曼树c语言版
一、哈夫曼树概念 哈夫曼树又称最优树给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大…...
食堂系统登录报错
因为数据库没有任何用户数据,所以会报错,需要添加admin用户 D:\env\jdk1.8.0_341\bin\java.exe -XX:TieredStopAtLevel1 -noverify -Dspring.output.ansi.enabledalways -Dcom.sun.management.jmxremote -Dspring.jmx.enabledtrue -Dspring.liveBeansVie…...
uniapp原生插件之乐橙摄像机播放插件(子账号云台对讲版)
插件介绍 乐橙摄像机播放插件(云台对讲版),集成视频播放,对讲模式、云台控制 插件地址 乐橙摄像机播放插件(子账号云台对讲版) - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 插件申请权限 麦克风权限(可参考示例项目ÿ…...
Http代理与socks5代理有何区别?如何选择?(一)
了解SOCKS和HTTP代理之间的区别对于优化您的在线活动至关重要,无论您是技术娴熟的个人、现代互联网用户还是企业所有者。在使用代理IP时,您需要先了解这两种协议之间的不同。 一、了解HTTP代理 HTTP(超文本传输协议)代理专门设计…...
system verilog VSCode Windows 配置简述
system verilog VSCode Windows 配置简述 本文章的目的并非完全在 VSCode 中进行 system verilog 编程,而是以 vivado 为核心,将 VSCode 作为编译器。 配置步骤 安装 ctags choco install universal-ctags如果你没有安装 chocolatey,见 i…...
Linux中的Shell编程
Linux中的Shell编程 shell编程快速入门 为什么要学习Shell编程? 1.Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。 2.对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些Shell脚本…...
图像特征Vol.1:计算机视觉特征度量|第二弹:【统计区域度量】
目录 一、前言二、统计区域度量2.1:图像矩特征2.1.1:原始矩/几何矩2.1.2:中心距2.1.3:归一化的中心矩2.1.4:不变矩——Hu矩2.1.5:OpenCv实现矩特征及其应用 2.2:点度量特征2.3:全局直…...
将图像的锯齿状边缘变得平滑的方法
项目背景 使用PaddleSeg 192x192 模型分割出来的目标有锯齿状边缘,想通过传统算法将这种锯齿状边缘的变得平滑,虽然试了很过方法,但是效果还是不太理想 常用的集中方法 当使用分割算法(如分水岭分割、阈值分割等)分…...
【MySQL索引与优化篇】数据库设计实操(含ER模型)
数据库设计实操(含ER模型) 文章目录 数据库设计实操(含ER模型)1. ER模型1.1 概述1.2 建模分析1.3 ER 模型的细化1.4 ER 模型图转换成数据表1. 一个实体转换成一个数据库表2. 一个多对多的关系转换成一个数据表3. 通过外键来表达1对…...
OpenCV—自动驾驶实时道路车道检测(完整代码)
自动驾驶汽车是人工智能领域最具颠覆性的创新之一。在深度学习算法的推动下,它们不断推动我们的社会向前发展,并在移动领域创造新的机遇。自动驾驶汽车可以去传统汽车可以去的任何地方,并且可以完成经验丰富的人类驾驶员所做的一切。但正确地训练它是非常重要的。自动驾驶汽…...
PostGIS轨迹分析——简化轨迹
需求 对轨迹线进行简化,并将原始轨迹上的两个特征点拉取到简化后的轨迹上 简化线 红色线是简化后的轨迹线,蓝色线是原始轨迹,有两个特征点 知识点: st_makeline函数将点连成线st_simplify简化线函数,其中第二个参数为坐标系的单位,0.002度大概代表0.002x1.11x10^5≈22…...
量化交易-应对市场闪崩
金融交易世界虽然提供了无与伦比的机会,但也并非没有陷阱。其中一个陷阱是闪崩现象,尤其是在算法交易领域。这些快速且常常无法解释的市场下跌可能会在几分钟内消除数十亿美元的价值。了解它们的起源、影响和预防策略对于参与算法交易的任何人都至关重要。本文深入研究了闪存…...
在Vue3+ElementPlus项目中使用具有懒加载的el-tree树形控件
前言 有时遇到一些需求就是在使用树形控件时,服务端并没有一次性返回所有数据,而是返回首层节点列表。然后点击展开首层节点中的某个节点,再去请求该节点的子节点列表,那么就得用上懒加载的机制了。在此以ElementPlus的树形控件为…...
高浓度工业废水处理设备有哪些
高浓度工业废水处理设备主要有以下几种: 水解酸化池:将有机废水通过水解、酸化作用,使其成为更易于生化降解的有机物。厌氧池:通过厌氧反应降解有机废水,产生沼气等可再利用资源。好氧池:将经过水解酸化或…...
linux上传mysql数据库
如果你使用的是Linux操作系统,并且需要上传MySQL数据库,那么可以按照以下步骤进行操作: 1. 在终端登录到你的Linux服务器; 2. 运行以下命令,以安装MySQL客户端:sudo apt-get install mysql-client…...
easyexcel根据模板导出Excel文件,表格自动填充问题
背景 同事在做easyexcel导出Excel,根据模板导出的时候,发现导出的表格,总会覆盖落款的内容。 这就很尴尬了,表格居然不能自动填充,直接怒喷工具,哈哈。 然后一起看了一下这个问题。 分析原因 我找了自…...
golang调用智能合约,获取合约函数的返回值
如果不是只读取数据的合约函数,需要异步的执行,因此并不能直接获取到合约函数的返回值,需要等到交易执行完毕,得到确认后才能获取到合约函数的返回值。而且合约函数返回值一般是通过事件日志获取到的。 这里给出一个例子来展示我…...
Django3框架-(3)-[使用websocket]:使用channels实现websocket功能;简化的配置和实际使用方式
概述: 对于Django使用channels实现websocket的功能,之前就写了几篇博文了。随着在项目的使用和实际维护来说,重新设置了相关处理方法。 一般来说,前后端都只维护一个全局的连接,通过携带数据来判断具体的操作&#x…...
java-工具类抛异常
不满足条件就会报错,这里的accessors ! null,就是等于空的时候(不满足)就会报错 accessors null; Assert.isTrue(ObjectUtil.isNotEmpty(accessors ! null), "数据为空");...
Navicat连接postgresql数据库 -->华为云服务器
Navicat连接postgresql数据库 -->华为云服务器 2.开放服务器端口:54323.Navicat连接postgresql数据库 2.开放服务器端口:5432 1-1.选择安全组 1-2. 添加规则 1-3.开放5432端口规则 1-4.查看规则 3.Navicat连接postgresql数据库...
Swoole vs RoadRunner vs PHP-PM:异步I/O配置参数对比表(含内存泄漏率、上下文切换耗时、FD复用率实测)
第一章:Swoole vs RoadRunner vs PHP-PM 异步I/O配置全景概览现代PHP高性能服务化方案中,Swoole、RoadRunner 和 PHP-PM 均通过常驻内存与异步I/O机制突破传统PHP-FPM的阻塞模型,但其实现路径、依赖模型与配置范式存在本质差异。三者均不依赖…...
在超大数据集下 DuckDB 与 MySQL 查询速度对比排
一、什么是urllib3? urllib3 是一个用于处理 HTTP 请求和连接池的强大、用户友好的 Python 库。 它可以帮助你: 发送各种 HTTP 请求(GET, POST, PUT, DELETE等)。 管理连接池,提高网络请求效率。 处理重试和重定向。 支…...
番茄小说下载器:5种格式批量下载与Web界面管理完全指南
番茄小说下载器:5种格式批量下载与Web界面管理完全指南 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 番茄小说下载器是一个功能强大的开源工具,专为小说爱好者和技…...
大型木构建筑市场洞察:949.1亿到1811亿的跨越与竞争格局
在全球建筑行业向绿色低碳转型的大背景下,大型木构建筑凭借其独特的低碳环保特性与现代建筑的安全性及功能性,正成为行业关注的焦点。据恒州诚思调研统计,2025年全球大型木构建筑收入规模约949.1亿元,到2032年收入规模将接近1811.…...
RAG 文本分块:七种主流策略的原理与适用场景
检索是 RAG 系统的搜索引擎,分块则是这个搜索引擎的基础。分块太长、太短、有噪声、切错了位置——随便犯哪个错LLM 都会有问题。行业里有句话流传很广:"分块决定了 RAG 质量的 70%。"这个说法不夸张:好的分块让检索器拿到完整、有…...
使用OpenSSL转换Fiddler证书为安卓系统格式的完整指南
1. 为什么需要转换Fiddler证书格式 很多安卓开发者都遇到过这样的问题:在Android 7.0及以上版本的设备上,即使安装了Fiddler的CA证书,仍然无法抓取某些应用的HTTPS流量。这是因为从Android 7.0开始,系统默认只信任系统证书存储区…...
Blazor Hybrid跨端失控?揭秘WinUI3/MacCatalyst/iOS 18原生桥接的3种反模式与1套工业级Bridge Protocol设计规范
第一章:Blazor Hybrid跨端失控的本质与2026技术拐点研判Blazor Hybrid 的“跨端失控”并非架构缺陷,而是其运行时契约在多宿主环境(WebView2、Android WebView、iOS WKWebView)中持续弱化的必然结果。当 .NET MAUI 或 Avalonia 作…...
突破Cursor使用限制:智能解决方案实现Pro功能持续访问
突破Cursor使用限制:智能解决方案实现Pro功能持续访问 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tri…...
IC670GBI002总线接口单元
IC670GBI002 总线接口单元 (BIU) 产品特点该总线接口单元是工业自动化系统中实现模块间高速、可靠数据通信的关键组件,保证控制系统稳定、高效运行。提供高速可靠的总线通信接口支持多模块数据交换,实现系统扩展数据传输稳定,确保控制精度响应…...
3步激活旧iOS设备:Legacy iOS Kit让经典设备重获新生
3步激活旧iOS设备:Legacy iOS Kit让经典设备重获新生 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 当…...
