当前位置: 首页 > news >正文

哈夫曼树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);
}

http://www.lryc.cn/news/214121.html

相关文章:

  • 食堂系统登录报错
  • uniapp原生插件之乐橙摄像机播放插件(子账号云台对讲版)
  • Http代理与socks5代理有何区别?如何选择?(一)
  • system verilog VSCode Windows 配置简述
  • Linux中的Shell编程
  • 图像特征Vol.1:计算机视觉特征度量|第二弹:【统计区域度量】
  • 将图像的锯齿状边缘变得平滑的方法
  • 【MySQL索引与优化篇】数据库设计实操(含ER模型)
  • OpenCV—自动驾驶实时道路车道检测(完整代码)
  • PostGIS轨迹分析——简化轨迹
  • 量化交易-应对市场闪崩
  • 在Vue3+ElementPlus项目中使用具有懒加载的el-tree树形控件
  • 高浓度工业废水处理设备有哪些
  • linux上传mysql数据库
  • easyexcel根据模板导出Excel文件,表格自动填充问题
  • golang调用智能合约,获取合约函数的返回值
  • Django3框架-(3)-[使用websocket]:使用channels实现websocket功能;简化的配置和实际使用方式
  • java-工具类抛异常
  • Navicat连接postgresql数据库 -->华为云服务器
  • Leetcode2086. 从房屋收集雨水需要的最少水桶数
  • Pandas教程(非常详细)(第一部分)
  • typing.Union` 标注一多种变量类型
  • OSPF高级特性
  • mysql中日期的加减 date_add()、date_sub() 函数
  • 实在智能携手品牌商家,在活动会面中共谋发展
  • EXSi系统安装与使用
  • Spring MVC (Next-1)
  • 双目视觉检测 KX02-SY1000型测宽仪 有效修正和消除距离变化对测量的影响
  • C++ 面向对象 学习 优秀教程
  • Python笔记——pyChram连接linux子系统,使用linux下的Python进行编译