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

【PTA数据结构 | C语言版】创建哈夫曼树

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

    • 题目
    • 代码

题目

请编写程序,根据给定的权重值序列,构建哈夫曼树,并计算带权路径长度。

输入格式:
输入首先给出一个不超 20 的正整数 n,随后一行给出 n 个权重值。其中权重值都是不超过 100 的正整数。

输出格式:
在一行中输出哈夫曼树的带权路径长度。

输入样例:
5
1 2 3 4 5

输出样例:
33

代码

#include <stdio.h>
#include <stdlib.h>typedef struct HuffmanNode {int weight;struct HuffmanNode *left, *right;
} HuffmanNode;typedef struct {HuffmanNode **array;int size;int capacity;
} MinHeap;// 创建新节点
HuffmanNode* newNode(int weight) {HuffmanNode* node = (HuffmanNode*)malloc(sizeof(HuffmanNode));node->weight = weight;node->left = node->right = NULL;return node;
}// 创建最小堆
MinHeap* createMinHeap(int capacity) {MinHeap* minHeap = (MinHeap*)malloc(sizeof(MinHeap));minHeap->size = 0;minHeap->capacity = capacity;minHeap->array = (HuffmanNode**)malloc(capacity * sizeof(HuffmanNode*));return minHeap;
}// 交换两个节点
void swapHuffmanNode(HuffmanNode** a, HuffmanNode** b) {HuffmanNode* t = *a;*a = *b;*b = t;
}// 最小堆化
void minHeapify(MinHeap* minHeap, int idx) {int smallest = idx;int left = 2 * idx + 1;int right = 2 * idx + 2;if (left < minHeap->size && minHeap->array[left]->weight < minHeap->array[smallest]->weight)smallest = left;if (right < minHeap->size && minHeap->array[right]->weight < minHeap->array[smallest]->weight)smallest = right;if (smallest != idx) {swapHuffmanNode(&minHeap->array[smallest], &minHeap->array[idx]);minHeapify(minHeap, smallest);}
}// 判断堆的大小是否为1
int isSizeOne(MinHeap* minHeap) {return minHeap->size == 1;
}// 提取最小值
HuffmanNode* extractMin(MinHeap* minHeap) {HuffmanNode* temp = minHeap->array[0];minHeap->array[0] = minHeap->array[minHeap->size - 1];--minHeap->size;minHeapify(minHeap, 0);return temp;
}// 插入新节点
void insertMinHeap(MinHeap* minHeap, HuffmanNode* node) {++minHeap->size;int i = minHeap->size - 1;while (i && node->weight < minHeap->array[(i - 1) / 2]->weight) {minHeap->array[i] = minHeap->array[(i - 1) / 2];i = (i - 1) / 2;}minHeap->array[i] = node;
}// 构建最小堆
void buildMinHeap(MinHeap* minHeap) {int n = minHeap->size - 1;int i;for (i = (n - 1) / 2; i >= 0; --i)minHeapify(minHeap, i);
}// 判断是否是叶子节点
int isLeaf(HuffmanNode* root) {return !(root->left) && !(root->right);
}// 创建并构建最小堆
MinHeap* createAndBuildMinHeap(int weights[], int size) {MinHeap* minHeap = createMinHeap(size);for (int i = 0; i < size; ++i)minHeap->array[i] = newNode(weights[i]);minHeap->size = size;buildMinHeap(minHeap);return minHeap;
}// 构建哈夫曼树
HuffmanNode* buildHuffmanTree(int weights[], int size) {HuffmanNode *left, *right, *top;MinHeap* minHeap = createAndBuildMinHeap(weights, size);while (!isSizeOne(minHeap)) {left = extractMin(minHeap);right = extractMin(minHeap);top = newNode(left->weight + right->weight);top->left = left;top->right = right;insertMinHeap(minHeap, top);}return extractMin(minHeap);
}// 计算带权路径长度
int calculateWPL(HuffmanNode* root, int depth) {if (root == NULL) return 0;if (isLeaf(root)) return root->weight * depth;return calculateWPL(root->left, depth + 1) + calculateWPL(root->right, depth + 1);
}int main() {int n;scanf("%d", &n);int weights[20];for (int i = 0; i < n; i++) {scanf("%d", &weights[i]);}HuffmanNode* root = buildHuffmanTree(weights, n);int wpl = calculateWPL(root, 0);printf("%d\n", wpl);return 0;
}

文章转载自:
http://biblicist.zzgtdz.cn
http://binnacle.zzgtdz.cn
http://bespangle.zzgtdz.cn
http://adoptee.zzgtdz.cn
http://baboonery.zzgtdz.cn
http://chiseled.zzgtdz.cn
http://agrimony.zzgtdz.cn
http://cantor.zzgtdz.cn
http://bessie.zzgtdz.cn
http://ceremonialism.zzgtdz.cn
http://bulgarian.zzgtdz.cn
http://bikeway.zzgtdz.cn
http://aymaran.zzgtdz.cn
http://arkhangelsk.zzgtdz.cn
http://baccalaureate.zzgtdz.cn
http://cheapen.zzgtdz.cn
http://bergall.zzgtdz.cn
http://araliaceous.zzgtdz.cn
http://bypath.zzgtdz.cn
http://aduertiser.zzgtdz.cn
http://asymmetric.zzgtdz.cn
http://beachbound.zzgtdz.cn
http://appendage.zzgtdz.cn
http://bioresmethrin.zzgtdz.cn
http://betsy.zzgtdz.cn
http://anabaptism.zzgtdz.cn
http://brevetcy.zzgtdz.cn
http://aweather.zzgtdz.cn
http://chemist.zzgtdz.cn
http://americanize.zzgtdz.cn
http://www.dtcms.com/a/280626.html

相关文章:

  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第二十一讲)
  • 【PDF识别改名】使用京东云OCR完成PDF图片识别改名,根据PDF图片内容批量改名详细步骤和解决方案
  • 同样是“跳转”,为何forward地址栏不变,redirect会变?
  • RNN、GRU 与 LSTM 计算成本深入对比
  • 基于光场相机的激光增材制造熔池温度场原位多眼监测​​
  • 【zynq7020】PL的“Hello LED”
  • FPGA高端图像ISP培训课程,提供工程源码+视频教程+FPGA开发板
  • Softhub软件下载站实战开发(十八):软件分类展示
  • 使用LNMP一键安装包安装PHP、Nginx、Redis、Swoole、OPcache
  • Vmware中安装的CentOS7如何扩展硬盘大小
  • 语言模型玩转3D生成:LLaMA-Mesh开源项目
  • 【鸿蒙HarmonyOS】鸿蒙app开发入门到实战教程(二):封装自定义可复用组件
  • 前端面试专栏-工程化:25.项目亮点与技术难点梳理
  • 手搓RAG
  • 知识增强型Agent开发新范式:基于ERNIE-4.5的检索增强生成架构实践
  • 力扣-使用双指针的方法的题们(持续更新中。。。
  • NipaPlay(视频播放器) v1.3.24 绿色版
  • ubuntu22.04谷歌浏览器中文输入法bug
  • 非实时的防控场景
  • 其他常见 HTTP 方法
  • redisson 设置了过期时间,会自动续期吗
  • 论文略读:QM-ARC: QoS-aware Multi-tier Adaptive Cache Replacement Strategy
  • 2025华为ODB卷-任务总执行时长-三语言题解
  • 图灵在二战期间是如何破译德国军用密码的?
  • 虚拟主机CPU占用100导致打不开的一次处理
  • 网络基础协议综合实验
  • GNU Radio连接X310运行报错
  • 【赵渝强老师】大数据交换引擎Sqoop
  • 实测两款效率工具:驾考刷题和证件照处理的免费方案
  • 【历史人物】【李白】生平事迹