实用文档之数据结构二叉树遍历实验报告Word下载.docx

上传人:b****5 文档编号:20844632 上传时间:2023-01-26 格式:DOCX 页数:13 大小:177.20KB
下载 相关 举报
实用文档之数据结构二叉树遍历实验报告Word下载.docx_第1页
第1页 / 共13页
实用文档之数据结构二叉树遍历实验报告Word下载.docx_第2页
第2页 / 共13页
实用文档之数据结构二叉树遍历实验报告Word下载.docx_第3页
第3页 / 共13页
实用文档之数据结构二叉树遍历实验报告Word下载.docx_第4页
第4页 / 共13页
实用文档之数据结构二叉树遍历实验报告Word下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

实用文档之数据结构二叉树遍历实验报告Word下载.docx

《实用文档之数据结构二叉树遍历实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《实用文档之数据结构二叉树遍历实验报告Word下载.docx(13页珍藏版)》请在冰豆网上搜索。

实用文档之数据结构二叉树遍历实验报告Word下载.docx

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

#include<

stdio.h>

stdlib.h>

malloc.h>

#defineElemTypechar

structBTreeNode{

ElemTypedata;

structBTreeNode*left;

structBTreeNode*right;

};

voidCreateBTree(structBTreeNode**T)

{

charch;

scanf_s("

\n%c"

&

ch);

if(ch=='

#'

)*T=NULL;

else{

(*T)=malloc(sizeof(structBTreeNode));

(*T)->

data=ch;

CreateBTree(&

((*T)->

left));

right));

}

}

voidPreorder(structBTreeNode*T)

if(T!

=NULL){

printf("

%c"

T->

data);

Preorder(T->

left);

right);

voidInorder(structBTreeNode*T)

=NULL){

Inorder(T->

voidPostorder(structBTreeNode*T)

Postorder(T->

voidLevelorder(structBTreeNode*BT)

structBTreeNode*p;

structBTreeNode*q[30];

intfront=0,rear=0;

if(BT!

=NULL){

rear=(rear+1)%30;

q[rear]=BT;

while(front!

=rear){

front=(front+1)%30;

p=q[front];

p->

if(p->

left!

rear=(rear+1)%30;

q[rear]=p->

left;

}

right!

right;

intgetHeight(structBTreeNode*T)

intlh,rh;

if(T==NULL)return0;

lh=getHeight(T->

rh=getHeight(T->

returnlh>

rh?

lh+1:

rh+1;

voidmain(void)

structBTreeNode*T;

CreateBTree(&

T);

printf("

前序序列:

\n"

);

Preorder(T);

中序序列:

Inorder(T);

后序序列:

Postorder(T);

层次遍历序列:

Levelorder(T);

二叉树高度:

%d\n"

getHeight(T));

4.运行结果

问题二:

哈夫曼编码、译码系统

对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件;

反过来,可将编码文件译码还原为一个文本文件(选做)。

v从文件中读入给定的一篇英文短文(文件为ASCII编码,扩展名为txt);

v统计并输出不同字符在文章中出现的频率(空格、换行、标点等不按字符处理);

v根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码;

v将文本文件利用哈夫曼树进行编码,存储成编码文件(编码文件后缀名.huf)

v进行译码,将huf文件译码为ASCII编码的txt文件,与原txt文件进行比较。

(选做)

(1)统计并输出不同字符在文章中出现的频率,通过建立两个数组chs和chs_freq来实现,chs存储文件中出现过的字符,chs_freq(初始化为全0)存储对应字符在文件中出现的频数,当扫描一个字符时,先与chs中已有字符进行比较,若数组中存在该字符,则将该字符对应频数加1,否则则将该字符加入数组,并频数加1。

(2)根据字符频率构造哈夫曼树,即将chs_freq数组作为权值数组,建立哈夫曼树,为了方便后续操作,为结构体BtreeNode添加一个新的成员变量symbol,建立二叉树时用以存储对应权值的字符。

(3)通过最优二叉树(哈夫曼树)输出每个字符的哈夫曼编码,是利用递归实现的,访问非叶子节点时,分别向左右子树递归调用,并将分支上的01编码保存到数组a对应元素中,向下一层len++。

访问到非叶子节点时输出其保存在数组中的编码序列,并将其保存至哈夫曼编码文件orde.code。

(4)将文本文件利用哈夫曼树进行编码:

每从文本文件中读取一个字符,则在哈夫曼编码文件order.code查找该字符,查找到后将该字符对应哈夫曼编码写入编码后文件order.huf。

并将order.code文件指针重新指向开头,准备对下一个字符进行操作。

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

typedefintElemType;

charsymbol;

voidCountChar(FILE*fp,char*chs,int*ch_freq){

intnum=0;

inti,tmp;

charch=fgetc(fp);

while(ch!

=EOF)

{

if((ch>

64&

&

ch<

91)||(ch>

96&

123)){

for(tmp=0;

tmp<

=num;

tmp++)

{

if(ch==chs[tmp]){ch_freq[tmp]++;

break;

if(tmp==num){chs[num]=ch;

ch_freq[num]++;

num++;

}

ch=fgetc(fp);

chs[num]='

\0'

;

for(i=0;

i<

num;

i++)printf("

%c%d\n"

chs[i],ch_freq[i]);

structBTreeNode*CreateHuffman(ElemTypea[],intn,charss[]){

inti,j;

structBTreeNode**b,*q;

q=malloc(sizeof(structBTreeNode));

b=malloc(n*sizeof(structBTreeNode*));

n;

i++){

b[i]=malloc(sizeof(structBTreeNode));

b[i]->

data=a[i];

b[i]->

left=b[i]->

right=NULL;

b[i]->

symbol=ss[i];

for(i=1;

intk1=-1,k2;

for(j=0;

j<

j++){

if(b[j]!

=NULL&

k1==-1){k1=j;

continue;

=NULL){k2=j;

for(j=k2;

if(b[j]->

data<

b[k1]->

data){k2=k1;

k1=j;

elseif(b[j]->

b[k2]->

data)k2=j;

q=malloc(sizeof(structBTreeNode));

q->

data=b[k1]->

data+b[k2]->

data;

left=b[k1];

q->

right=b[k2];

b[k1]=q;

b[k2]=NULL;

free(b);

returnq;

voidHuffCoding(structBTreeNode*FBT,intlen){

staticinta[50];

chartmp;

FILE*fp;

inti;

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;

len;

i++){

printf("

%d"

a[i]);

tmp=a[i]+48;

fputc(tmp,fp);

fputc('

\n'

else{

a[len]=0;

HuffCoding(FBT->

left,len+1);

a[len]=1;

right,len+1);

fclose(fp);

voidTransCode(FILE*src){

FILE*fp1,*fp2;

charch1,ch2;

if((fp1=fopen("

r"

if((fp2=fopen("

order.huf"

fseek(src,0L,SEEK_SET);

ch1=fgetc(src);

ch2=fgetc(fp1);

while(ch1!

if((ch1>

ch1<

91)||(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);

charchs[100];

intch_freq[100]={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