中国优质的IT技术网站
专业IT技术创作平台
IT职业在线教育平台
本文包含两个文件的代码和一张测试效果图:
HuffmanTree.h文件: 哈夫曼树的存储结构与创建函数HuffmanCreatTest.cpp文件: 用于测试
效果图:(如下)
HuffmanTree.h文件:
#include <stdio.h> #include <stdlib.h> typedef struct{ int weight; int parent,lchild,rchild; }HTNode, *HuffmanTree; void Select(HuffmanTree HT, int n, int *s1, int *s2) { int minum; // 定义一个临时变量保存最小值? for(int i = 1; i <= n; i++) // 以下是找到第一个最小值 { if(HT[i].parent == 0) { minum = i; break; } } for(int i = 1; i <= n; i++) { if(HT[i].parent == 0) if(HT[i].weight < HT[minum].weight) minum = i; } *s1 = minum; // 以下是找到第二个最小值,且与第一个不同 for(int i = 1; i <= n; i++) { if(HT[i].parent == 0 && i != *s1) { minum = i; break; } } for(int i = 1; i <= n; i++) { if(HT[i].parent == 0 && i != *s1) if(HT[i].weight < HT[minum].weight) minum = i; } *s2 = minum; } void CreateHuffmanTree(HuffmanTree &HT, int *w, int n) { if(n <= 1){ return; } int m, i, s1, s2; m = 2 * n - 1; HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 分配空间 for(i = 1; i <= m; i++){ //将1~m号结点初始化 HT[i].weight = w[i]; HT[i].parent = 0; HT[i].lchild = 0; HT[i].rchild = 0; } printf("\n哈夫曼树是: \n"); int num = 1; for(i = n + 1; i <= m; i++){ //通过n-1次的【选择】、【删除】、【合并】来创建哈夫曼树 //【选择】在HT[k](1<=k<=i-1)中选择两个:双亲域为0且权值最小的结点,并返回它们在HT中的序号s1和s2 Select(HT, i-1, &s1, &s2); //【删除】得到新结点i,从森林中删除s1,s2,即将s1和s2的双亲域由0改为i HT[s1].parent = i; HT[s2].parent = i; // 【合并】将s1和s2的权值和作为一个新结点的权值依次存入到数组的第n+1之后的单元中,同时记录这个新结点左孩子的下标s1,右孩子的下标为s2 HT[i].lchild = s1; HT[i].rchild = s2; HT[i].weight = HT[s1].weight + HT[s2].weight; if(i <= m - 1){ printf("%d (%d, %d)\n", HT[i].weight, HT[s1].weight, HT[s2].weight); } else{ printf("T: (%d, %d)\n", HT[s1].weight, HT[s2].weight); } } printf("\n"); }
HuffmanCreatTest.cpp文件:
#include "HuffmanTree.h" int main() { HuffmanTree HT; int n; printf("输入叶子结点的数量:"); scanf("%d", &n); int w[n+1]; for(int i=1; i<=n; i++) { printf("\n输入第%d个结点的权值:", i); scanf("%d", &w[i]); } CreateHuffmanTree(HT, w, n); }
微信扫码分享