C语言实现Huffman树并计算带权路径长度
来源:互联网 发布:任务计划 软件 编辑:程序博客网 时间:2024/04/29 07:51
More Code,More progress
#include<stdio.h>#include<stdlib.h>typedef int ElemType;typedef struct _BTreeNode { ElemType data; struct _BTreeNode* left; struct _BTreeNode* right;}BTreeNode;//根据数组 a 中 n 个权值建立一棵哈夫曼树,返回树根指针BTreeNode* CreateHuffman(ElemType a[], int n){ int i, j; BTreeNode **b, *q; b = (BTreeNode **)malloc(n*sizeof(BTreeNode)); for (i = 0; i < n; i++) //初始化b指针数组,使每个指针元素指向a数组中对应的元素结点 { b[i] =(BTreeNode *) malloc(sizeof(BTreeNode)); b[i]->data = a[i]; b[i]->left = b[i]->right = NULL; } for (i = 1; i < n; i++)//进行 n-1 次循环建立哈夫曼树 { //k1表示森林中具有最小权值的树根结点的下标,k2为次最小的下标 int k1 = -1, k2; for (j = 0; j < n; j++)//让k1初始指向森林中第一棵树,k2指向第二棵 { if (b[j] != NULL && k1 == -1) { k1 = j; continue; } if (b[j] != NULL) { k2 = j; break; } } for (j = k2; j < n; j++)//从当前森林中求出最小权值树和次最小 { if (b[j] != NULL) { if (b[j]->data < b[k1]->data) { k2 = k1; k1 = j; } else if (b[j]->data < b[k2]->data) k2 = j; } } //由最小权值树和次最小权值树建立一棵新树,q指向树根结点 q =(BTreeNode *) malloc(sizeof(BTreeNode)); q->data = b[k1]->data + b[k2]->data; q->left = b[k1]; q->right = b[k2]; b[k1] = q;//将指向新树的指针赋给b指针数组中k1位置 b[k2] = NULL;//k2位置为空 } free(b); //删除动态建立的数组b return q; //返回整个哈夫曼树的树根指针}ElemType WeightPathLength(BTreeNode* FBT, int len)//len初始为0{ if (FBT == NULL) //空树返回0 return 0; else { if (FBT->left == NULL && FBT->right == NULL)//访问到叶子结点 return FBT->data * len; else //访问到非叶子结点,进行递归调用,返回左右子树的带权路径长度之和,len递增 return WeightPathLength(FBT->left,len+1)+WeightPathLength(FBT->right,len+1); }}//主函数void main(){ int n, i; ElemType* a; BTreeNode* fbt; while(1) { scanf("%d", &n); if (n > 1) break; else printf("重输n值:"); } a =(int *) malloc(n*sizeof(ElemType)); for (i = 0; i < n; i++) scanf(" %d", &a[i]); fbt = CreateHuffman(a, n); printf("%d\n", WeightPathLength(fbt, 0)); }
0 0
- C语言实现Huffman树并计算带权路径长度
- 哈夫曼(Huffman)树创建及其带权路径长度(WPL)、哈夫曼编码、哈夫曼解码
- Huffman树与Huffman编码(C语言实现)
- C语言实现任意长度多项式计算(非递归,不带括号)
- 构造哈夫曼树并求带权路径长度(c语言/CodeBlocks实现)
- 解决关于哈夫曼编码计算带权路径长度问题
- 哈夫曼编码计算带权路径长度问题
- 哈夫曼树结构和带权路径长度计算
- Huffman编码的c语言实现
- Huffman编码的C语言实现
- PAT Huffman Codes 哈弗曼树,C语言实现
- 求其带权路径长度
- 【C++】Huffman树的实现
- c实现字符串长度计算
- (哈夫曼树10.3.1)POJ 3253 Fence Repair(计算带权路径长度最小的哈夫曼树)
- huffman编解码实现(C语言实现版本)
- C语言中计算一个数组长度
- C语言计算字符串的长度strlen
- 虚函数表指针、虚基类表指针
- C++Primer第五版 10.2.3节练习
- linux crontab 定时执行计划命令
- 挂载,卸载,读,关
- (莫比乌斯模板abcd区间)
- C语言实现Huffman树并计算带权路径长度
- 【js】javascript变量声明优先级
- Linux关于IP的操作
- C++语言里const修饰符和指针前后位置的作用、区别详解
- 屏幕适配-文件夹命名
- 欢迎使用CSDN-markdown编辑器
- Java 序列化的高级认识
- java笔记——初学面向对象08匿名内部类
- linux关于文件共享