哈夫曼树的创建

C++ 哈夫曼树的创建 输入 n 个数,创建一颗含 n 个叶子结点的哈夫曼树,并遍历这这棵哈夫曼树 阅读详情

哈夫曼树每次选取两个最小值,然后将两个最小值之和再存入到权值中,如果用数组每次都排序插入在排序,效率不高,本文采用最小堆的形式,堆中的元素为带权值的哈夫曼结点。

代码如下:

/************************************************************************
*
* 文件名:5.2.1.cpp
*
* 文件描述:哈夫曼树
*
* 创建人:  fdk

* 时  间:  2018-08-12
*
* 版本号:1.0
*
* 修改记录:
*
************************************************************************/
#include <iostream>
#include <cstdlib>
#include <algorithm>
#define MAXSIZE 164
#define MinData -100
using namespace std;
typedef struct HTNode Node; //哈夫曼树类型
struct HTNode
{
    int weight;  //结点权值
    Node *left;  //指向左子树
    Node *right; //指向右子树
};

typedef struct HNode Heap;         //堆的类型定义
struct HNode
{
    int sizes;    //堆中当前的元素个数
    Node datas[MAXSIZE];
};


Node * CreateNode(int v)
{
    Node * node = (Node*)malloc(sizeof(struct HTNode));
    node->weight = v;
    node->left = NULL;
    node->right = NULL;
    return node;
}

/*插入操作*/
void Insert(Heap *MinHeap, Node *node)
{
    /*将元素x插入最小堆,其中H->datas[0]已经定义为哨兵*/
    int i;
    i = ++MinHeap->sizes; //i指向插入后,堆中的最后一个元素的位置
    for (; MinHeap->datas[i / 2].weight > node->weight; i /= 2)
    {
        MinHeap->datas[i] = MinHeap->datas[i/2];   //上滤
    }
    MinHeap->datas[i] = *node;  //将新结点插入
}

/*创建最小堆*/
Heap * BuildHeap(int arr[], int n)
{
    Heap * MinHeap = (Heap*)malloc(sizeof(struct HNode));
    MinHeap->sizes = 0;
    MinHeap->datas[0] = *CreateNode(MinData);

    for (int i = 0; i < n; i++)
    {
        Node * node = CreateNode(arr[i]);
        Insert(MinHeap, node);
    }
    return MinHeap;
}




/*从最小堆中取出一个结点,并删除一个结点*/
Node * DeleteMin(Heap * minHeap)
{
    /*从最小堆中取出键值为最小的元素,并删除一个结点*/
    int sizes = minHeap->sizes;


    int resultsizes = minHeap->sizes--;
    Node * datas = minHeap->datas;
    Node lastnode = minHeap->datas[sizes];

    Node *firstnode = CreateNode(datas[1].weight);
    firstnode->left = datas[1].left;
    firstnode->right = datas[1].right;

    int parent;  //父结点
    int child;   //子结点
    for (parent = 1; parent * 2 <= resultsizes; parent = child)
    {
        child = parent * 2;
        if ((child != resultsizes) && (datas[child].weight > datas[child+1].weight))
        {
            child++;   //去左右子结点中最小的
        }
        if (lastnode.weight <= datas[child].weight)
        {
            break;  //找到了合适的位置
        }
        else
        {
            /*下滤*/
            minHeap->datas[parent] = minHeap->datas[child];
        }
    }
    minHeap->datas[parent] = lastnode;

    return firstnode;
}


/*哈夫曼树*/
Node * BuildHuffman(Heap * minHeap)
{
    int sizes = minHeap->sizes;
    Node * newNode;
    /*做N-1次合并*/
    for (int i = 0; i < sizes - 1; i++)
    {
        newNode = CreateNode(0);       //建立一个新的根结点
        newNode->left = DeleteMin(minHeap);  //从最小堆中删除一个结点,作为新T的左子结点
        newNode->right = DeleteMin(minHeap); //从最小堆中删除一个结点,作为新T的右子结点
        newNode->weight = newNode->left->weight + newNode->right->weight;

        Insert(minHeap, newNode);
    }
    newNode = CreateNode(0);
    newNode = DeleteMin(minHeap);
    return newNode;
}

/*打印叶子结点*/
void PrintLeaves(Node * node)
{
    if (node)
    {
        if (!node->left && !node->right)
        {
            cout << node->weight << " ";
        }
        PrintLeaves(node->left);
        PrintLeaves(node->right);
    }
}

/*递归前序遍历*/
void PreOrderTraversal(Node *node)
{
    if (node)
    {
        cout << node->weight << " ";
        PreOrderTraversal(node->left);
        PreOrderTraversal(node->right);
    }
}

/*递归中序遍历*/
void InOrderTraversal(Node *node)
{
    if (node)
    {
        InOrderTraversal(node->left);
        cout << node->weight << " ";
        InOrderTraversal(node->right);
    }
}

int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6};
    int length = sizeof(arr) / sizeof(arr[0]);

    Heap *MinHeap = BuildHeap(arr, length);

    Node *Huffman = BuildHuffman(MinHeap);

    PreOrderTraversal(Huffman);
    cout << endl;

    InOrderTraversal(Huffman);
    cout << endl;

    PrintLeaves(Huffman);
    return 0;
}

 

C++创建哈夫曼树 1、输入结点个数和权重创建哈夫曼树 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc++.h> using namespace std; //haffman 树的结构 typedef struct { //叶子结点权值 unsigned int weight; //指向双亲,和孩子结点的指针 unsigned int parent; unsigned int lChild; unsigned 阅读详情

相关推荐

数据结构14:哈夫曼树的创建和编码

摘要: 哈夫曼树是十分重要的,常用于压缩的编码和解码。但写起来也比较折磨。 迟到的代码,实在抱歉。上代码! 一.代码块 其实由于哈夫曼树结点的度要么为0,要么为2,并且输入的编码的元素必为 叶节点,所以n个元素也就是n个叶节点的哈夫曼树必为2n-1个总结点。知道了结点个数,我们肯定更喜欢用顺序存储(数组)来存储哈夫曼树,而孩子和双亲则类似于静态链表,用下标代替地址 1)结构体定义 typedef struct huffmanTree { char data; int weight; int lchil

qq_70132617的博客 4483

哈夫曼树的构建方法

哈夫曼树一、哈夫曼树的定义二、构建思路三、代码实现定义树查找最小的两个权值的结点建立哈夫曼树总代码: 一、哈夫曼树的定义 首先需要理解几个问题: 1、什么是路径 在一棵树中,从一个结点到另一个结点所经过的所有结点,被我们称为两个结点之间的路径 2、什么是路径长度 在一棵树中,从一个结点到另一个结点所经过的“边”的数量,被我们称为两个结点之间的路径长度。 3、什么是结点的带权路径长度 树的每一个结点,都可以拥有自己的“权重”(Weight),权重在不同的算法当中可以起到不同的作用。结点的带权路径长度,是指树的

moonshadow44的博客 1万+

数据结构编程实践(七)创建哈夫曼树、生成哈夫曼编码、完成图片的压缩与解压缩

一、对图片的压缩与解压缩,涉及以下内容:1.文件读写2.创建Huffman树3.生成Huffman编码4.压缩图片文件5 .  解压缩图片文件 二、将项目分成三个小任务,下一任务是在上一任务的基础上完成:1.任务一:统计权值、创建Huffman树2.任务二:生成Huffman编码、保存压缩文件3.任务三:解压压缩文件,恢复原文件下面开始完整的步骤:三、统计权值、生成Huffman树1.Huffma...

青红造了个大白之成长记 1万+

哈夫曼树原理解析,构造方法,意义和作用。

哈夫曼树(最优二叉树) 百度百科:https://baike.baidu.com/item/%E5%93%88%E5%A4%AB%E6%9B%BC%E6%A0%91/2305769?fr=aladdin 一. 目的: 找出存放一串字符所需的最少的二进制编码 二. 构造方法: 首先统计出每种字符出现的频率!(也可以是概率)//权值 ----------------------------...

Anakki的博客 30万+

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

weixin_57514792的博客 1104

避坑指南:在Ubuntu 20.04上从零部署IS-Fusion环境(含CUDA 11.1和PyTorch 1.10.1配置)

本文提供了在Ubuntu 20.04系统上从零部署IS-Fusion 3D目标检测环境的详细避坑指南。内容涵盖CUDA 11.1、PyTorch 1.10.1、spconv等核心组件的精确版本安装与兼容性配置,并指导如何准备nuScenes数据集及启动模型训练,旨在帮助研究者和开发者高效搭建稳定的多模态融合算法开发环境。

gitlab7runner的博客 551

哈夫曼树

路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。图 1 中,从根结点到结点 a 之间的通路就是一条路径。 路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1 。图 1 中从根结点到结点 c 的路径长度为 3。 结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。例如,图 1 中结点 a 的权为 7,结点 b 的权为 5。 结点的带权路径长度:指的是从根结点到该结点之间的路径长度

simple5960的博客 1145

【项目实战-MATLAB】:基于机器学习的虹膜识别系统设计

虹膜识别主要包括虹膜定位、虹膜裁剪、极坐标变换、归一化、HOG特征提取、虹膜识别六个主要步骤。本系统采用MATLAB作为开发工具实现 主要算法:霍夫变换预处理 HOG特征提取 SVM进行识别

qq_45047246的博客 6537

数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!

重复循环"爸爸去哪儿"这个过程

weixin_75202470的博客 1万+

心理学量表汇总 50多个 附下载

目录一、心理健康与精神病态量表二、行为问题量表三、人格评估量表四、智力测验一、心理健康与精神病态量表1.一般症状自评量表(SCL-90)症状自评量表 (The self-report symptom inventory ,Symptom checklist ,90,简称 SCL90) 有 90 个评定项目 , 每个项目分五级评分 , 包含了比较广泛的精神病症状学内容, 从感觉、 情 感、思维、意识、行为直至生活习惯、人际关系、饮食等均有涉及,能准确刻划被试的自觉 症状,能较好地反映被试的问题及其严重程度和变

南七小僧的学海无涯 1904

【Python LeetCode 专题】面试经典 150 题

面试经典 150 题

一杯水果茶!足矣~ 1173

【哈夫曼树】创建哈夫曼树

在一棵树中,从一个结点到另外一个结点所经过得所有的结点,我们成为两个结点之间得路径。从A到叶子结点E的路径就是:A->B->D->E;在一棵树中,从一个几点到另外一个结点所经过的边的数量,就是路径长度。从根结点A到叶子结点E,共经过了3条边,因此路径长度是3。树的每一个结点,都可以拥有自己的“权重”(weight),权重在不同的算法中起到不同的作用。结点的带权路径长度 = 树的根节点到该结点的路径长度 * 该结点权重。

weixin_52958292的博客 5401

医疗AI多智能体资源调度:用Python构建高性能MCU资源池

本文介绍了医疗AI服务平台中多智能体资源争用问题的解决方案。作者设计了一个基于MCU(多点控制单元)理念的中央资源调度器,通过三层架构(资源抽象层、调度策略层、执行控制层)实现对GPU、API、数据库等医疗资源的统一管理。系统采用增强版信号量机制处理可计数并发资源,优化令牌桶算法管理速率资源,并支持急诊优先、配额限制、审计合规等医疗场景特殊需求。核心代码提供了带优先级抢占的并发控制和医疗专用令牌桶实现,可有效解决多智能体资源争用导致的优先级混乱、资源利用不均等问题。

AllenLV的博客 3213

哈夫曼树的创建和编码

哈夫曼树的创建和编码                    1.哈夫曼树又称最优二叉树,是一类带权路径长度最短的树。        对于最优二叉树,权值越大的结点越接近树的根结点,权值越小的结点越远离树的根结点。        最优二叉树的构造算法步骤:        (1)根据给定的n个权值w1,w2,...,wn构成n棵二叉树森林F={T1,T2,...,Tn},其中每一棵二叉

火雨(Nick) 4万+

Win11 系统下 VisualStudio2022 配置点云库 PCL1.11.1

安装完成之后打开文件夹E:\PCL 1.11.1\3rdParty\OpenNI2双击 并选择路径 (E:\PCL 1.11.1\3rdParty\OpenNI2) 安装即可全部安装完成之后,将pcl-1.11.1-pdb-msvc2019-win64.zip解压后的 .pdb文件拷贝到(E:\PCL 1.11.1\bin)中设置环境变量:到此,环境变量配置完成。

qq_53545309的博客 1126

YOLO+OpenCV强强联手:高精度跌倒检测技术实战解析

(0, 1), (0, 2), (1, 3), (2, 4), # 脖子和头部(3, 5), (5, 6), (5, 7), (7, 9), (5,11),# 左臂(4,6), (6, 12), (6,8) ,(8,10),# 右臂(11, 12), (11, 13), (13, 15), #左腿(12, 14), (14, 16) #右腿keypoints是检测到的人体关键点数据,frame是图像帧,boxes是检测到的边界框信息。定义了人体关键点之间的连接关系,用于绘制人体骨架。

yolo模型训练找我,AI游戏合作找我 2311

哈夫曼树之顺序创建

什么是哈夫曼树: 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 摘要 哈夫曼树(霍夫曼树)又称为最优树. 1、路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结...

浦柳人的博客 2327

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数据结构作业之哈夫曼树的创建,编码,解码

数据结构作业,哈夫曼树的创建,编码,解码 哈夫曼树的生成: #define M 80 typedef struct { char data; int weight; int parent,lch,rch; }NodeType; typedef NodeType HufTree[M+1]; typedef char ** HufCode; /*在huffman树中选出两个双亲为0且权值最小...

氧化钙的博客 2752

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

哈夫曼树的创建和应用

要创建和使用哈夫曼树,就要有相应的结构定义,首先要定义一个树结构,还要定义一个栈来存储每个字符对应的哈夫曼编码。//最大读入的文本文件字符长度char c;int weight;//记录节点表示的二进制,左0右1int binary;//是否创建节点,0未创建,1创建;int flag;int top;}STACK;

m0_73995622的博客 1099

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

哈夫曼树Huff的创建

①定义以及作用 哈夫曼树:哈夫曼树是字符的编码,目的是为了获取最小的WPL,即最小的代价(表达能力有限,不知道咋说),顾名思义来理解吧,就是为了编码!!! 哈夫曼的创建 哈夫曼树的创建是基于堆来实现的,所以事先需要对堆有所了解,查看上篇博客QAQ。。 哈夫曼树树的建树原理,想必大家都知道,就是根据权值数组来建立的: 过程是:1.从权值数组中挑选出两个最小的权值,建立两个树节点,作为左右儿子,父节...

阿凡提的博客 470

哈夫曼树(最优二叉树)的创建

哈夫曼树是带权路径最小的一种特殊二叉树,所以也称最优二叉树。 在这里不讨论基本概念如怎样计算路径等,而仅仅着重于树的创建,详细过程让我们举例而言。 其主要的原理为:将全部节点一開始都视为森林。每次从森林中选取两个根节点权值最小的树合并为一棵新树,新树的根节点大小为两个子节点大小的和,并将这棵新树又一次增加到森林中。 如此一来每一轮操作都能够简化为两个基本操作:合...

adr5970的博客 441

创建哈夫曼树

原因:构造函数传的是值,所以一出了构造函数原地址变乱码 改进:构造函数传地址 直接使用“Shift+F11”直接跳到断点 new A和new A()一样 没有区别,new A()显式的调用构造函数, new A隐式的调用构造函数,都是调用A():a(1),b(2){cout<<“A的构造函数被执行”<<endl;}; 假如calss A还有一个构造函数 A(int ...

qq_41967508的博客 205

哈夫曼树的创建(输入权值)与遍历

哈夫曼树的创建加粗样式 欢迎使用Markdown编辑在这里插入代码片器 #include <iostream> #include <malloc.h> using namespace std; //分别定义叶子节点,一度节点,二度节点数量,并初始化为0 int Node_0 = 0, Node_1 = 0, Node_2 = 0; //哈夫曼树结点结构体 struct ...

ffff_uck的博客 4442
上一篇: 堆的建立、插入、删除以及堆排序
下一篇: 7-4 List Leaves
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值