1、树和二叉树的实验报告数据结构实验报告题目: 树和二叉树 一、 用二叉树来表示代数表达式(一)需求分析 输入一个正确的代数表达式,包括数字和用字母表示的数,运算符号+ - * / =及括号。系统根据输入的表达式建立二叉树,按照先括号里面的后括号外面的,先乘后除的原则,每个节点里放一个数字或一个字母或一个操作符,括号不放在节点里。分别先序遍历,中序遍历,后序遍历此二叉树,并输出表达式的前缀式,中缀式和后缀式。(二)系统设计1. 本程序中用到的所有抽象数据类型的定义;typedef struct BiNode /二叉树的存储类型 char s20; struct BiNode *lchild,*rc
2、hild;BiTNode,*BiTree;2. 主程序的流程以及各程序模块之间的层次调用关系,函数的调用关系图:3列出各个功能模块的主要功能及输入输出参数void push(char cc)初始条件:输入表达式中的某个符号操作结果:将输入的字符存入buf数组中去BiTree Create_RTree()初始条件:给出二叉树的定义表达式操作结果:构造二叉树的右子树,即存储表达式等号右侧的字符组BiTree Create_RootTree()初始条件:给出二叉树的定义表达式操作结果:构造存储输入表达式的二叉树,其中左子树存储X,根节点存储:=void PreOrderTraverse(BiTree
3、 T)初始条件:二叉树T存在操作结果:先序遍历T,对每个节点调用函数Visit一次且仅一次void InOrderTraverse(BiTree T)初始条件:二叉树T存在操作结果:中序遍历T,对每个节点调用函数Visit一次且仅一次void PostOrderTraverse(BiTree T)初始条件:二叉树T存在操作结果:后序遍历T,对每个节点调用函数Visit一次且仅一次int main() 主函数,调用各方法,操作成功后返回0(三)调试分析 调试过程中还是出现了一些拼写错误,经检查后都能及时修正。有些是语法设计上的小错误,比如一些参变量的初始值设置错误,使得程序调试出错。还有操作符优
4、先级设计不够合理,在输出遍历表达式结果时有错误。在小组讨论分析后纠正了这些结果,并尽量改进了算法的性能,减小时间复杂度。 有输入表达式建立二叉树的时间复杂度为O(n),先序遍历和中序遍历及后序遍历的时间复杂度都为O(n).(四)测试结果X:=(-b+(b2-4*a*c)0.5)/(2*a)(5)用户手册 打开界面后,根据提示,输入代数表达式,包括包括数字和用字母表示的数,运算符号+ - * / =及括号。输入完毕回车后系统将显示表达式的前缀式,中缀式,后缀式。(六)附录源程序:#include#include#include typedef struct BiNode char s20; st
5、ruct BiNode *lchild,*rchild;BiTNode,*BiTree;char ch,bt1024;int len=0;void push(char c) if (len0) /输入结束,堆栈中为右节点的值 if(Q=(BiTNode*)malloc(sizeof(BiTNode)=NULL) return NULL; memset(Q-s,0x00,sizeof(Q-s); Q-lchild=NULL; Q-rchild=NULL; memcpy(Q-s,bt,len); len =0; return Q; return NULL; else if (ch = () if(
6、Q=(BiTNode*)malloc(sizeof(BiTNode)=NULL) return NULL; memset(Q-s,0x00,sizeof(Q-s); Q-rchild = NULL; Q-lchild =Create_RTree(); ch=getchar(); if(ch=n) return Q; Q-s0=ch; Q-rchild=Create_RTree(); return Q; else if(ch =) if(len0) if(Q=(BiTNode*)malloc(sizeof(BiTNode)=NULL) return NULL; memset(Q-s,0x00,s
7、izeof(Q-s); Q-lchild=NULL; Q-rchild=NULL; memcpy(Q-s,bt,len); len=0; return Q; return NULL; else if(ch =+|ch=-|ch =*|ch =/|ch =) if(T=(BiTNode*)malloc(sizeof(BiTNode)=NULL) return NULL; if(Q=(BiTNode*)malloc(sizeof(BiTNode)=NULL) return NULL; memset(Q-s,0x00,sizeof(Q-s); memset(T-s,0x00,sizeof(T-s);
8、 T-lchild=NULL; T-rchild=NULL; if(len=0) if(ch =+|ch =-) / 只有+-号前面可以不是数字,此时左节点为空 T-s0=ch; if(S=(BiTNode*)malloc(sizeof(BiTNode)=NULL) return NULL; memset(S-s,0x00,sizeof(S-s); S-lchild=NULL; S-rchild=NULL; p=S-s; while(1) ch=getchar(); if(ch=+|ch =-|ch =*|ch =/|ch=) break; *p+=ch; T-rchild=S; else r
9、eturn NULL; else /堆栈中为左节点值 memcpy(T-s,bt,len); len =0; Q-lchild=T; Q-s0=ch; if(Q-rchild = Create_RTree() = NULL) return NULL; else return Q; else push(ch); return NULL;BiTNode *Create_RootTree() BiTree Q,T; while(ch=getchar()!= EOF) if (ch=n) return NULL; else if(ch=:) /构造根节点:= ch=getchar(); if(ch!=
10、) return NULL; if(Q=(BiTNode*)malloc(sizeof(BiTNode)=NULL) return NULL; memset(Q-s,0x00,sizeof(Q-s); memcpy(Q-s,bt,len); len =0; Q-lchild = NULL; Q-rchild = NULL; if(T=(BiTNode*)malloc(sizeof(BiTNode)=NULL) return NULL; T-lchild = Q; memset(T-s,0x00,sizeof(T-s); memcpy(T-s,:=,2); /继续处理:=后面的数据,作为根节点的
11、右节点 if(T-rchild=Create_RTree()=NULL) return NULL; return T; else push(ch); return NULL;void PreOrderTraverse(BiTree T) if(T) printf(%s ,T-s); PreOrderTraverse(T-lchild); PreOrderTraverse(T-rchild); else return;void InOrderTraverse(BiTree T) if(T) InOrderTraverse(T-lchild); printf(%s ,T-s); InOrderTr
12、averse(T-rchild); else return; void PostOrderTraverse(BiTree T) if(T) PostOrderTraverse(T-lchild); PostOrderTraverse(T-rchild); printf(%s ,T-s); else return;int main() printf(请输入一个中缀表达式:n); BiTree T=NULL; if(T=Create_RootTree()=NULL) return 0; printf(先序遍历:); PreOrderTraverse(T); printf(n); printf(中序遍历:); InOrderTraverse(T); printf(n); printf(后序遍历:); PostOrderTraverse(T); printf(n); return 0;测试数据结果:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1