数据结构之---C语言实现哈夫曼树和编码
2015-07-03 00:03
796 查看
//哈夫曼树 //杨鑫 #include <stdio.h> #include <stdlib.h> typedef int ElemType; struct BTreeNode { ElemType data; struct BTreeNode* left; struct BTreeNode* right; }; //遍历哈夫曼树 void PrintBTree_int(struct BTreeNode* BT) { if (BT != NULL) { printf("%d", BT->data); if (BT->left != NULL || BT->right != NULL) { printf(" ( "); PrintBTree_int(BT->left); //输出左子树 if (BT->right != NULL) printf(" , "); PrintBTree_int(BT->right); //输出右子树 printf(" ) "); } } } //创建哈夫曼树 struct BTreeNode* CreateHuffman(ElemType a[], int n) { int i, j; struct BTreeNode **b, *q; b = malloc(n*sizeof(struct BTreeNode)); for (i = 0; i < n; i++) //动态内存分配 { b[i] = malloc(sizeof(struct BTreeNode)); b[i]->data = a[i]; b[i]->left = b[i]->right = NULL; } for (i = 1; i < n; i++) { //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 = malloc(sizeof(struct BTreeNode)); q->data = b[k1]->data + b[k2]->data; q->left = b[k1]; q->right = b[k2]; b[k1] = q; b[k2] = NULL; } free(b); return q; } //计算带权路径 ElemType WeightPathLength(struct 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 return WeightPathLength(FBT->left,len+1)+WeightPathLength(FBT->right,len+1); } } //构造哈夫曼编码 void HuffManCoding(struct BTreeNode* FBT, int len) { static int a[10]; if (FBT != NULL) { if (FBT->left == NULL && FBT->right == NULL) { int i; printf("结点的值为%d的编码:", FBT->data); for (i = 0; i < len; i++) printf("%d", a[i]); printf("\n"); } else { a[len] = 0; HuffManCoding(FBT->left, len + 1); a[len] = 1; HuffManCoding(FBT->right, len + 1); } } } int main() { int n, i; ElemType* a; struct BTreeNode* fbt; printf("请输入带权结点数n:\n"); while(1) { scanf("%d", &n); if (n > 1) break; else printf("重输n值:"); } a = malloc(n * sizeof(ElemType)); printf("输入%d个整数作为权值:\n", n); for (i = 0; i < n; i++) scanf(" %d", &a[i]); fbt = CreateHuffman(a, n); printf("哈夫曼树如下:\n"); PrintBTree_int(fbt); printf("\n"); printf("哈夫曼树的带权路径长度:\n"); printf("%d\n", WeightPathLength(fbt, 0)); printf("树中每个叶子结点的哈夫曼编码:\n"); HuffManCoding(fbt, 0); return 0; }
如图:
相关文章推荐
- 离散数学Notes
- Codeforces Round #311 (Div. 2) E. Ann and Half-Palindrome (DP+字典树)
- 【数据结构】堆栈和队列
- 2015华为软赛(四)——数据结构设计
- 数据结构复习001
- Binder学习一——Binder基础数据结构
- 数据结构与算法之二叉树(一)-----建立二叉树以及反转二叉树
- COJ979 WZJ的数据结构(负二十一)
- 编程之久除了算法和数据结构 什么也不属于我们
- 数据机构与算法-数据结构的一些基本概念
- 数据机构与算法-数据结构的一些基本概念
- 基于C语言的通用数据结构和算法库
- 【数据结构】Java单链表的逆序
- JS数据结构之BinarySearchTree
- COJ980 WZJ的数据结构(负二十)
- 数据结构与算法之七大排序总结
- raw数据结构
- 算法与数据结构先导章
- swift排序算法和数据结构
- E. GukiZ and GukiZianap平方分桶