用C语言实现哈夫曼树的生成,并输出带权路径长度,时间复杂度为O(n)。的完整代码
时间: 2024-03-17 07:40:49 浏览: 73
基于c语言实现哈夫曼树-
好的,这里是用C语言实现哈夫曼树的生成,并输出带权路径长度的完整代码:
```
#include <stdio.h>
#include <stdlib.h>
// 定义哈夫曼树结点
typedef struct node {
int weight; // 权值
int parent, lchild, rchild; // 双亲、左右孩子结点的下标
} HTNode, *HuffmanTree;
// 初始化哈夫曼树
void InitHuffmanTree(HuffmanTree *HT, int n) {
(*HT) = (HuffmanTree)malloc((2 * n - 1) * sizeof(HTNode));
for (int i = 0; i < 2 * n - 1; i++) {
(*HT)[i].weight = 0;
(*HT)[i].parent = -1;
(*HT)[i].lchild = -1;
(*HT)[i].rchild = -1;
}
}
// 选择权值最小的两个结点
void Select(HuffmanTree HT, int n, int *s1, int *s2) {
int min1 = 999, min2 = 999; // 初始化为较大的值
*s1 = -1, *s2 = -1;
for (int i = 0; i < n; i++) {
if (HT[i].parent == -1) {
if (HT[i].weight < min1) {
min2 = min1;
*s2 = *s1;
min1 = HT[i].weight;
*s1 = i;
} else if (HT[i].weight < min2) {
min2 = HT[i].weight;
*s2 = i;
}
}
}
}
// 建立哈夫曼树
void CreateHuffmanTree(HuffmanTree *HT, int *w, int n) {
InitHuffmanTree(HT, n); // 初始化哈夫曼树
for (int i = 0; i < n; i++) {
(*HT)[i].weight = w[i];
}
for (int i = n; i < 2 * n - 1; i++) {
int s1, s2;
Select(*HT, i, &s1, &s2); // 选择权值最小的两个结点
(*HT)[s1].parent = i;
(*HT)[s2].parent = i;
(*HT)[i].lchild = s1;
(*HT)[i].rchild = s2;
(*HT)[i].weight = (*HT)[s1].weight + (*HT)[s2].weight;
}
}
// 输出带权路径长度
void OutputWPL(HuffmanTree HT, int n) {
int wpl = 0;
for (int i = 0; i < n; i++) {
int parent = HT[i].parent;
int weight = HT[i].weight;
while (parent != -1) {
if (HT[parent].lchild == i) { // 当前结点是左孩子
wpl += weight;
}
weight = HT[parent].weight;
parent = HT[parent].parent;
}
}
printf("带权路径长度为:%d\n", wpl);
}
int main() {
int w[] = { 5, 6, 8, 7, 15, 9 };
int n = sizeof(w) / sizeof(int);
HuffmanTree HT;
CreateHuffmanTree(&HT, w, n); // 建立哈夫曼树
OutputWPL(HT, n); // 输出带权路径长度
return 0;
}
```
这个代码遵循了题目的要求,实现了哈夫曼树的生成,并输出带权路径长度,时间复杂度为O(n)。
阅读全文