树和二叉树的实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告
题目:树和二叉树
一、 用二叉树来表示代数表达式
(一)需求分析
输入一个正确的代数表达式,包括数字和用字母表示的数,运算符号+ - * / ^ =及括号。系统根据输入的表达式建立二叉树,按照先括号里面的后括号外面的,先乘后除的原则,每个节点里放一个数字或一个字母或一个操作符,括号不放在节点里。分别先序遍历,中序遍历,后序遍历此二叉树,并输出表达式的前缀式,中缀式和后缀式。 (二)系统设计
1. 本程序中用到的所有抽象数据类型的定义;
typedef struct BiNode //二叉树的存储类型 {
char s[20];
struct BiNode *lchild,*rchild; }BiTNode,*BiTree;
2. 主程序的流程以及各程序模块之间的层次调用关系,函数的调用关系图:
3.列出各个功能模块的主要功能及输入输出参数 void push(char cc)
初始条件:输入表达式中的某个符号 操作结果:将输入的字符存入buf 数组中去 BiTree Create_RTree()
初始条件:给出二叉树的定义表达式
操作结果:构造二叉树的右子树,即存储表达式等号右侧的字符组 BiTree Create_RootTree()
Create_RootTree() 构造二叉树 Main()
Create_RTree() 构造右子树
PreOrderTraverse(BiTree T) 先序遍历二叉树 InOrderTraverse(BiTree T) 中序遍历二叉树
PostOrderTraverse(BiTree T) 后序遍历二叉树
初始条件:给出二叉树的定义表达式
操作结果:构造存储输入表达式的二叉树,其中左子树存储‘X’,根节点存储‘:=’void PreOrderTraverse(BiTree T)
初始条件:二叉树T存在
操作结果:先序遍历T,对每个节点调用函数Visit一次且仅一次
void InOrderTraverse(BiTree T)
初始条件:二叉树T存在
操作结果:中序遍历T,对每个节点调用函数Visit一次且仅一次
void PostOrderTraverse(BiTree T)
初始条件:二叉树T存在
操作结果:后序遍历T,对每个节点调用函数Visit一次且仅一次
int main()
主函数,调用各方法,操作成功后返回0
(三)调试分析
调试过程中还是出现了一些拼写错误,经检查后都能及时修正。有些是语法设计上的小错误,比如一些参变量的初始值设置错误,使得程序调试出错。还有操作符优先级设计不够合理,在输出遍历表达式结果时有错误。在小组讨论分析后纠正了这些结果,并尽量改进了算法的性能,减小时间复杂度。
有输入表达式建立二叉树的时间复杂度为O(n),先序遍历和中序遍历及后序遍历的时间复杂度都为O(n).
(四)测试结果
X:=(-b+(b^2-4*a*c)^0.5)/(2*a)
(五)用户手册
打开界面后,根据提示,输入代数表达式,包括包括数字和用字母表示的数,运算符号+ - * / ^ =及括号。输入完毕回车后系统将显示表达式的前缀式,中缀式,后缀式。(六)附录
源程序:
#include
#include
#include
typedef struct BiNode
{
char s[20];
struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;
char ch,bt[1024];
int len=0;
void push(char c)
{
if (len<1024)
bt[len++] = c;
}
BiTree Create_RTree()
{
BiTree T,Q,S;
char *p;
while(ch!=EOF)
{
ch=getchar();
if(ch=='\n')
{
if(len>0)
{
//输入结束,堆栈中为右节点的值
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((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->s[0]=ch;
Q->rchild=Create_RTree();
return Q;
}
else if(ch ==')')
{
if(len>0)
{
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 =='+'||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));
T->lchild=NULL;
T->rchild=NULL;
if(len==0)
{
if(ch =='+'||ch =='-')
{
// 只有+-号前面可以不是数字,此时左节点为空
T->s[0]=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;