C语言实现Huffman树并计算带权路径长度
2015-09-16 20:32
381 查看
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)); }
相关文章推荐
- C++语言里const修饰符和指针前后位置的作用、区别详解
- c语言命名空间,cin.get().cin.getline()
- VC++创建和调用dll
- 数据的4种逻辑结构与4种存储结构
- c++多继承布局
- c++多继承布局
- C/C++从入门到精通(入门、进阶、精通)
- 酷壳陈皓:如何学好C语言
- 结构体大小
- 酷壳陈皓:如何学好C++语言
- c++异或运算
- 替换字符串中空格算法
- C++技术点积累(4)——继承、多态、抽象类
- C++技术点积累(3)——对象初始化列表、运算符重载
- 单例模式C++实现
- c++find函数用法
- 1.2 Implement a function void reverse(char* str) in C or C++ which reverses a nullterminated string.
- C++入门第一步:一些格式上的注意
- c++简单用户界面
- 国外程序员整理的C++ 资源大全