数据结构二叉树遍历实验报告Word格式文档下载.docx
- 文档编号:21741652
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:13
- 大小:177.04KB
数据结构二叉树遍历实验报告Word格式文档下载.docx
《数据结构二叉树遍历实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构二叉树遍历实验报告Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
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);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 二叉 遍历 实验 报告