版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
问题一: 二叉树遍历问题描述设输入该二叉树的前序序列为:ABC##DE#G##F##HI##J#K##(#代表空子树)请编程完成下列任务:⑴请根据此输入来建立该二叉树,并输出该二叉树的前序、中序和后序序列;⑵按层次遍历的方法来输出该二叉树按层次遍历的序列;⑶求该二叉树的高度。设计描述1)二叉树是一种树形结构,遍历就是要让树中的所有节点被且仅被访问一次,即按一定规律排列成一个线性队列。二叉(子)树是一种递归定义的结构,包含三个部分:根结点(N)、左子树(L)、右子树(R)。根据这三个部分的访问次序对二叉树的遍历进行分类, 总共有 6种遍历方案:NLR、LNR、LRN、NRL、RNL和LNR。研究二叉树的遍历就是研究这 6种具体的遍历方案,显然根据简单的对称性,左子树和右子树的遍历可互换,即 NLR与NRL、LNR与RNL、LRN与RLN,分别相类似,因而只需研究 NLR、LNR和LRN三种即可,分别称为“先序遍历” 、“中序遍历”和“后序遍历” 。采用递归方式就可以容易的实现二叉树的遍历,算法简单且直观。(2)此外,二叉树的层次遍历即按照二叉树的层次结构进行遍历, 按照从上到下,同一层从左到右的次序访问各节点。 遍历算法可以利用队列来实现, 开始时将整个树的根节点入队,然后每从队列中删除一个节点并输出该节点的值时,都将它的非空的左右子树入队,当队列结束时算法结束。(3)计算二叉树高度也是利用递归来实现: 若一颗二叉树为空, 则它的深度为0,否则深度等于左右子树的最大深度加一。3.源程序#include<stdio.h>#include<stdlib.h>#include<malloc.h>#defineElemTypecharstructBTreeNode{6ElemTypedata;7structBTreeNode*left;8structBTreeNode*right;};voidCreateBTree(structBTreeNode**T){12charch;13scanf_s("\n%c",&ch);14if(ch=='#')*T=NULL;15else{16(*T)=malloc(sizeof(structBTreeNode));17(*T)->data=ch;18CreateBTree(&((*T)->left));19CreateBTree(&((*T)->right));20}}voidPreorder(structBTreeNode*T){24if(T!=NULL){25printf("%c",T->data);26Preorder(T->left);27Preorder(T->right);28}}voidInorder(structBTreeNode*T){32if(T!=NULL){33Inorder(T->left);34printf("%c",T->data);35Inorder(T->right);36}}voidPostorder(structBTreeNode*T){40if(T!=NULL){41Postorder(T->left);42Postorder(T->right);43printf("%c",T->data);44}}voidLevelorder(structBTreeNode*BT)47{48structBTreeNode*p;49structBTreeNode*q[30];50intfront=0,rear=0;51if(BT!=NULL){52rear=(rear+1)%30;53q[rear]=BT;54}55while(front!=rear){56front=(front+1)%30;57p=q[front];58printf("%c",p->data);59if(p->left!=NULL){60rear=(rear+1)%30;61q[rear]=p->left;62}63if(p->right!=NULL){64rear=(rear+1)%30;65q[rear]=p->right;66}67}}intgetHeight(structBTreeNode*T){71intlh,rh;72if(T==NULL)return0;73lh=getHeight(T->left);74rh=getHeight(T->right);75returnlh>rh?lh+1:rh+1;}voidmain(void){79structBTreeNode*T;80CreateBTree(&T);81printf("前序序列:\n");82Preorder(T);83printf("\n");84printf("中序序列:\n");85Inorder(T);86printf("\n");87printf("后序序列:\n");88Postorder(T);89printf("\n");90printf("层次遍历序列:\n");91Levelorder(T);92printf("\n");93printf("二叉树高度:%d\n",getHeight(T));94}运行结果问题二: 哈夫曼编码、译码系统问题描述对一个ASCII编码的文本文件中的字符进行哈夫曼编码, 生成编码文件;反过来,可将编码文件译码还原为一个文本文件(选做) 。从文件中读入给定的一篇英文短文 (文件为 ASCII编码,扩展名为 txt);统计并输出不同字符在文章中出现的频率 (空格、换行、标点等不按字符处理);根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码;将文本文件利用哈夫曼树进行编码,存储成编码文件(编码文件后缀名.huf)进行译码,将比较。(选做)
huf
文件译码为
ASCII
编码的
txt
文件,与原
txt
文件进行2. 设计描述(1)统计并输出不同字符在文章中出现的频率,通过建立两个数组chs_freq 来实现,chs存储文件中出现过的字符, chs_freq
chs和(初始化为全 0)存储对应字符在文件中出现的频数,当扫描一个字符时,先与chs中已有字符进行比较,若数组中存在该字符,则将该字符对应频数加1,否则则将该字符加入数组,并频数加 1。(2)根据字符频率构造哈夫曼树, 即将chs_freq 数组作为权值数组, 建立哈夫曼树,为了方便后续操作,为结构体 BtreeNode添加一个新的成员变量symbol,建立二叉树时用以存储对应权值的字符。3)通过最优二叉树(哈夫曼树)输出每个字符的哈夫曼编码,是利用递归实现的,访问非叶子节点时,分别向左右子树递归调用,并将分支上的01编码保存到数组a对应元素中,向下一层len++。访问到非叶子节点时输出其保存在数组中的编码序列,并将其保存至哈夫曼编码文件orde.code。4)将文本文件利用哈夫曼树进行编码:每从文本文件中读取一个字符,则在哈夫曼编码文件order.code查找该字符,查找到后将该字符对应哈夫曼编码写入编码后文件order.huf。并将order.code文件指针重新指向开头,准备对下一个字符进行操作。3.源程序#include<stdio.h>#include<stdlib.h>typedefintElemType;structBTreeNode{5ElemTypedata;6structBTreeNode*left;7structBTreeNode*right;8charsymbol;9};10voidCountChar(FILE*fp,char*chs,int*ch_freq){11intnum=0;12inti,tmp;13charch=fgetc(fp);14while(ch!=EOF)15{16if((ch>64&&ch<91)||(ch>96&&ch<123)){17for(tmp=0;tmp<=num;tmp++)18{19if(ch==chs[tmp]){ch_freq[tmp]++;break;}20if(tmp==num){chs[num]=ch;ch_freq[num]++;num++;break;}21}22}23ch=fgetc(fp);24}25chs[num]='\0';26for(i=0;i<num;i++)printf("%c%d\n",chs[i],ch_freq[i]);}structBTreeNode*CreateHuffman(ElemTypea[],intn,charss[]){29inti,j;30structBTreeNode**b,*q;31q=malloc(sizeof(structBTreeNode));32b=malloc(n*sizeof(structBTreeNode*));33for(i=0;i<n;i++){34b[i]=malloc(sizeof(structBTreeNode));35b[i]->data=a[i];b[i]->left=b[i]->right=NULL;b[i]->symbol=ss[i];36}37for(i=1;i<n;i++){38intk1=-1,k2;39for(j=0;j<n;j++){40if(b[j]!=NULL&&k1==-1){k1=j;continue;}41if(b[j]!=NULL){k2=j;break;}42}43for(j=k2;j<n;j++){44if(b[j]!=NULL){45if(b[j]->data<b[k1]->data){k2=k1;k1=j;}46elseif(b[j]->data<b[k2]->data)k2=j;47}48}49q=malloc(sizeof(structBTreeNode));50q->data=b[k1]->data+b[k2]->data;51q->left=b[k1];q->right=b[k2];52b[k1]=q;b[k2]=NULL;53}54free(b);55returnq;};voidHuffCoding(structBTreeNode*FBT,intlen){58staticinta[50];59chartmp;60FILE*fp;61inti;62if(len==0)fp=fopen("order.code","w");63if((fp=fopen("order.code","a"))==NULL){printf("文件打开失败!64if(FBT!=NULL){65if(FBT->left==NULL&&FBT->right==NULL){66printf("%c霍夫曼编码为:",FBT->symbol);67fputc(FBT->symbol,fp);68fputc('\t',fp);69for(i=0;i<len;i++){70printf("%d",a[i]);71tmp=a[i]+48;72fputc(tmp,fp);73}74printf("\n");fputc('\n',fp);75}76else{77a[len]=0;HuffCoding(FBT->left,len+1);78a[len]=1;HuffCoding(FBT->right,len+1);79}80}81fclose(fp);}voidTransCode(FILE*src){84FILE*fp1,*fp2;85charch1,ch2;86if((fp1=fopen("order.code","r"))==NULL){printf("文件打开失败!87if((fp2=fopen("order.huf","w"))==NULL){printf("文件打开失败!88fseek(src,0L,SEEK_SET);89ch1=fgetc(src);90ch2=fgetc(fp1);91while(ch1!=EOF)92{93if((ch1>64&&ch1<91)||(ch1>96&&ch1<123)){94while(ch2!=EOF){95if(ch2==ch1){96fgetc(fp1);9
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 单位管理制度集粹选集人员管理
- 《电化学局部腐蚀》课件
- 单位管理制度分享合集职工管理篇
- 单位管理制度范例汇编员工管理篇
- 单位管理制度呈现汇编【人力资源管理篇】十篇
- 2024班级安全教育工作总结范文(30篇)
- 《行政职业能力测验》2024年公务员考试云霄县高分冲刺试卷含解析
- 《材料性能力学性能》课件
- 《室内设计调研报告》课件
- 《物流项目运营管理》课件
- 管辖权异议仲裁申请书
- (完整版)中考英语作文必备好词好句
- T-CERDS 3-2022 企业ESG评价体系
- 落实国家组织药品集中采购使用检测和应急预案
- 报价经理岗位职责
- 汝州某燃煤热电厂施工组织设计
- 猪场配怀工作安排方案设计
- 《广东省普通高中学生档案》模板
- GB/T 2-2016紧固件外螺纹零件末端
- GB/T 12467.5-2009金属材料熔焊质量要求第5部分:满足质量要求应依据的标准文件
- GB 17740-1999地震震级的规定
评论
0/150
提交评论