哈夫曼树c语言版

news2024/11/30 5:01:25

一、哈夫曼树概念

        哈夫曼树又称最优树给定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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

传输层协议——TCP协议 (详解!!!)

目录 TCP的报文格式 1. 源端口号&#xff0c;目的端口号 和 udp 相同&#xff08;前面文章介绍了udp&#xff09; 2. 4位首部长度 —— TCP的报头长度 3. 选项 —— option &#xff08;可选的&#xff1a;可以有&#xff0c;可以没有&#xff09; 4.保留&#xff08;6…

linux下mysql-8.2.0集群部署(python版本要在2.7以上)

目录 一、三台主机准备工作 1、mysql官方下载地址&#xff1a;https://dev.mysql.com/downloads/ 2、修改/etc/hosts 3、关闭防火墙 二、三台主机安装mysql-8.2.0 1、解压 2、下载相应配置 3、初始化mysql&#xff0c;启动myslq&#xff0c;设置开机自启 4、查看初始密…

java基础--多线程学习

写在前面&#xff1a; 多线程在面试中问的很多&#xff0c;之前没有过系统的学习&#xff0c;现在来进行一个系统的总结学习 文章目录 基础java多线程实现无参无返回值线程快速创建start和run方法的探讨run方法线程状态 有返回值线程线程池执行小结关于抛出异常的扩展 线程方…

人脸检索 M:N(视频,摄像头),调用百度API

目录 创建百度智能云账号 代码部分&#xff1a; 创建百度智能云账号 网址&#xff1a; 百度智能云-云智一体深入产业 点击导航栏中的产品&#xff0c;再选择人脸与人体 再选择人脸搜索 进入后&#xff0c;可以先去领取免费资源&#xff0c;如果不领取&#xff0c;后面是无法…

macOS Sourcetree 选择文件比较工具 Kaleidoscope

Sourcetree 选择文件比较工具 Kaleidoscope Kaleidoscope 使用的命令行工具是 ksdiff。Sourcetree 集成 Kaleidoscope之前&#xff0c;必须先安装 ksdiff。 Kaleidoscope 使用的命令行工具是 ksdiff。Sourcetree 集成 Kaleidoscope之前&#xff0c;必须先安装 ksdiff。 打开Ka…

5.3 用户定义的完整性

思维导图&#xff1a; 5.3 用户定义的完整性 用户定义的完整性是确保数据库中的数据满足特定应用的语义要求。这是通过关系数据库管理系统(RDBMS)中的内置机制来完成的&#xff0c;不需要依赖应用程序来执行。 5.3.1 属性上的约束条件 1. 定义属性上的约束条件 当在CREATE T…

架构风格-架构师(六十六)

管道-过滤器和仓库 数据处理方式&#xff1a; 管道过滤器是 数据驱动机制&#xff0c;处理流程事前确定&#xff0c;交互差。 仓库是通过仓库中间件交互&#xff0c;交互性强&#xff0c;灵活组装 系统可扩展性&#xff1a; 管道过滤器是数和处理在一起&#xff0c;需要新增…

金Gien乐道 | 10月热点回顾

收获之秋&#xff0c;中电金信Q4开篇捷报不断 Q4开篇&#xff0c;中电金信迎来多个捷报。公司与青岛财通集团联合打造的核心业务系统&#xff08;一体化业务平台&#xff09;一期项目顺利投产上线并平稳运行&#xff1b;中标华南某全国性股份制商业银行新一代云原生分布式核心系…

系列四、全局配置文件mybatis-config.xml

一、全局配置文件中的属性 mybatis全局配置中的文件非常多&#xff0c;主要有如下几个&#xff1a; properties&#xff08;属性&#xff09;settings&#xff08;全局配置参数&#xff09;typeAliases&#xff08;类型别名&#xff09;typeHandlers&#xff08;类型处理器&am…

prompt工程

微信公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、prompt基础 提示包括传递给语言模型的指令和语境&#xff0c;以实现预期的任务。提示工程是开发和优化提示的实践&#xff0c;以便在各种应用…

YOLO目标检测——安全帽佩戴检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;安全帽佩戴检测数据集可以用于实时检测工作人员是否按照要求佩戴了安全帽&#xff0c;以保障他们的安全数据集说明&#xff1a;安全帽佩戴检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;图片分为带头盔和没带头…

贪吃蛇代码实现与剖析(C语言)

贪吃蛇代码实现与剖析[C语言] 1.温馨提示2.最终实现版本的样子1.游戏开始-欢迎界面2.游戏运行界面3.游戏结束界面4.选择是否继续玩1.选择继续 2.选择退出游戏 3.完整代码一.Win32相关API的介绍1.控制台程序1.什么是控制台程序2.命令提示符中设置控制台窗口的大小3.控制台行和列…

【Linux】Nignx及负载均衡动静分离

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…

数据标准是什么?如何建立企业的数据标准?

2023年10月25日国家数据局正式揭牌&#xff0c;由国家发展和改革委员会管理。国家数据局的主要职责是负责协调推进数据基础制度建设&#xff0c;统筹数据资源整合共享和开发利用&#xff0c;统筹推进数字中国、数字经济、数字社会规划和建设等。国家越来越重视数据资源的价值&a…

Explaining and harnessing adversarial examples

Explaining and harnessing adversarial examples----《解释和利用对抗样本》 背景&#xff1a; 早期的研究工作认为神经网络容易受到对抗样本误导是由于其非线性特征和过拟合。 创新点&#xff1a; 该论文作者认为神经网络易受对抗性扰动影响的主要原因是它的线性本质&#xf…

第五章 I/O管理 十、磁盘调度算法(FCFS、SSTF、SCAN、C-SCAN、C-LOOK)

目录 一、概括 二、一次磁盘读/写操作需要的时间 1、寻找时间&#xff08;寻道时间)&#xff1a; 2、延迟时间&#xff1a; 3、传输时间&#xff08;读磁盘的时间&#xff09; 三、先来先服务算法&#xff08;FCFS&#xff09; 1、定义&#xff1a; 2、例子&#xff1…

Qwt QwtPolarPlot类使用

1.概述 QwtPolarPlot是Qwt库中用于绘制极坐标图的类。它继承自QwtPolarItemDict和QFrame类&#xff0c;并且可以作为QwtPlot控件的一部分使用。 以下是类的继承关系图&#xff1a; 2.常用方法 设置标签&#xff1a; void setTitle (const QString &)void setTitle (con…

降低毕业论文写作压力的终极指南

亲爱的同学们&#xff0c;时光荏苒&#xff0c;转眼间你们即将踏入毕业生的行列。毕业论文作为本科和研究生阶段的重要任务&#xff0c;不仅是对所学知识的综合运用&#xff0c;更是一次对自己学术能力和专业素养的全面考验。然而&#xff0c;论文写作常常伴随着压力和焦虑&…

YOLOv5:修改backbone为MobileOne

YOLOv5&#xff1a;修改backbone为MobileOne 前言前提条件相关介绍MobileOneYOLOv5修改backbone为MobileOne修改common.py修改yolo.py修改yolov5.yaml配置 参考 前言 记录在YOLOv5修改backbone操作&#xff0c;方便自己查阅。由于本人水平有限&#xff0c;难免出现错漏&#xf…

前端基础之JavaScript

JavaScript是一种能够在网页上添加交互效果的脚本语言&#xff0c;也被称为客户端语言。它可以在网页中操作HTML元素、改变CSS样式&#xff0c;以及处理用户的交互事件等。 以下是JavaScript的常见基础知识点&#xff1a; 变量和数据类型&#xff1a;JavaScript中的变量可以存…