1、202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394#include stdlib.hmalloc.h#define ElemType charstruct BTreeNode ElemType data; struct BTreeNode* left; struct BTreeNode* right;void CreateBTree(struct
2、BTreeNode* T) char ch; scanf_s(n%c, &ch); if (ch = #) *T = NULL; else (*T) = malloc(sizeof(struct BTreeNode); (*T)-data = ch; CreateBTree(&(*T)-left);right); void Preorder(struct BTreeNode* T) if (T != NULL) printf(%c , T-data); Preorder(T-left);right);void Inorder(struct BTreeNode* T)= NULL) Inorde
3、r(T-void Postorder(struct BTreeNode* T) Postorder(T-void Levelorder(struct BTreeNode* BT) struct BTreeNode* p; struct BTreeNode* q30; int front=0,rear=0; if(BT!=NULL) rear=(rear+1)% 30; qrear=BT; while(front!=rear) front=(front+1)% 30; p=qfront;,p- if(p-left! rear=(rear+1)% 30; qrear=p-left; right!r
4、ight;int getHeight(struct BTreeNode* T) int lh,rh; if (T = NULL) return 0; lh = getHeight(T- rh = getHeight(T- return lhrh ? lh + 1 : rh + 1;void main(void) struct BTreeNode* T; CreateBTree(&T); printf(前序序列:n); Preorder(T);中序序列: Inorder(T);后序序列: Postorder(T);层次遍历序列: Levelorder(T);二叉树高度:%dn, getHeigh
5、t(T);4.运行结果问题二: 哈夫曼编码、译码系统对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件;反过来,可将编码文件译码还原为一个文本文件(选做)。v从文件中读入给定的一篇英文短文(文件为ASCII编码,扩展名为txt);v统计并输出不同字符在文章中出现的频率(空格、换行、标点等不按字符处理);v根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码;v将文本文件利用哈夫曼树进行编码,存储成编码文件(编码文件后缀名.huf)v进行译码,将huf文件译码为ASCII编码的txt文件,与原txt文件进行比较。(选做)(1)统计并输出不同字符在文章中出现的频率,通过建立两个数组
6、chs和chs_freq来实现,chs存储文件中出现过的字符,chs_freq(初始化为全0)存储对应字符在文件中出现的频数,当扫描一个字符时,先与chs中已有字符进行比较,若数组中存在该字符,则将该字符对应频数加1,否则则将该字符加入数组,并频数加1。(2)根据字符频率构造哈夫曼树,即将chs_freq数组作为权值数组,建立哈夫曼树,为了方便后续操作,为结构体BtreeNode添加一个新的成员变量symbol,建立二叉树时用以存储对应权值的字符。(3)通过最优二叉树(哈夫曼树)输出每个字符的哈夫曼编码,是利用递归实现的,访问非叶子节点时,分别向左右子树递归调用,并将分支上的01编码保存到数组
7、a对应元素中,向下一层len+。访问到非叶子节点时输出其保存在数组中的编码序列,并将其保存至哈夫曼编码文件orde.code。(4)将文本文件利用哈夫曼树进行编码:每从文本文件中读取一个字符,则在哈夫曼编码文件order.code查找该字符,查找到后将该字符对应哈夫曼编码写入编码后文件order.huf。并将order.code文件指针重新指向开头,准备对下一个字符进行操作。9596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129typedef int
8、 ElemType; char symbol;void CountChar(FILE *fp,char* chs,int* ch_freq) int num = 0; int i,tmp; char ch = fgetc(fp); while (ch != EOF) if (ch64 & ch96 &123) for (tmp = 0; tmp = num; tmp+) if (ch = chstmp) ch_freqtmp+; break; if (tmp = num) chsnum = ch; ch_freqnum+; num+; ch = fgetc(fp); chsnum=0; for
9、 (i = 0; i data = ai; bi-left = bi-right = NULL;bi-symbol = ssi; for (i = 1; int k1 = -1, k2; for (j = 0; j data data) k2 = k1; k1 = j; else if (bj- bk2-data) k2 = j; q = malloc(sizeof(struct BTreeNode); q-data = bk1-data + bk2-data;left = bk1; q-right = bk2; bk1 = q; bk2 = NULL; free(b); return q;v
10、oid HuffCoding(struct BTreeNode* FBT, int len) static int a50; char tmp; FILE *fp; int i; if(len = 0) fp=fopen(order.code,w if(fp=fopen(a) = NULL) printf(文件打开失败!exit(1); if (FBT ! if (FBT-left = NULL & FBT-right = NULL) printf(%c霍夫曼编码为:, FBT-symbol); fputc(FBT-symbol,fp); fputc(t,fp); for (i = 0; le
11、n; i+) printf(%d, ai); tmp=ai+48; fputc(tmp,fp);fputc(n else alen = 0; HuffCoding(FBT-left, len + 1); alen = 1;right, len + 1); fclose(fp);void TransCode(FILE *src) FILE *fp1,*fp2; char ch1,ch2; if(fp1=fopen(r if(fp2=fopen(order.huf fseek(src,0L,SEEK_SET); ch1 = fgetc(src); ch2 = fgetc(fp1); while (
12、ch1 ! if (ch1 ch1 while(ch2 != EOF) if(ch2 = ch1) fgetc(fp1); ch2=fgetc(fp1); while(ch2!=) fputc(ch2,fp2); ch2=fgetc(fp1); fputc(,fp2); break; ch2 = fgetc(fp1); if(ch2 = EOF) printf(未找到对应编码! rewind(fp1); ch2 = fgetc(fp1); ch1 = fgetc(src); fclose(fp1); fclose(fp2); char chs100; int ch_freq100 = 0;order.txt CountChar(fp,chs,ch_freq); T = CreateHuffman(ch_freq,strlen(chs),chs); HuffCoding(T,0); TransCode(fp);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1