树和二叉树的实验报告.docx

上传人:b****1 文档编号:700452 上传时间:2022-10-12 格式:DOCX 页数:14 大小:50.58KB
下载 相关 举报
树和二叉树的实验报告.docx_第1页
第1页 / 共14页
树和二叉树的实验报告.docx_第2页
第2页 / 共14页
树和二叉树的实验报告.docx_第3页
第3页 / 共14页
树和二叉树的实验报告.docx_第4页
第4页 / 共14页
树和二叉树的实验报告.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

树和二叉树的实验报告.docx

《树和二叉树的实验报告.docx》由会员分享,可在线阅读,更多相关《树和二叉树的实验报告.docx(14页珍藏版)》请在冰豆网上搜索。

树和二叉树的实验报告.docx

树和二叉树的实验报告

《数据结构》

实验报告

题目:

树和二叉树

 

一、用二叉树来表示代数表达式

(一)需求分析

输入一个正确的代数表达式,包括数字和用字母表示的数,运算符号+-*/^=及括号。

系统根据输入的表达式建立二叉树,按照先括号里面的后括号外面的,先乘后除的原则,每个节点里放一个数字或一个字母或一个操作符,括号不放在节点里。

分别先序遍历,中序遍历,后序遍历此二叉树,并输出表达式的前缀式,中缀式和后缀式。

(二)系统设计

1.本程序中用到的所有抽象数据类型的定义;

typedefstructBiNode//二叉树的存储类型

{

chars[20];

structBiNode*lchild,*rchild;

}BiTNode,*BiTree;

2.主程序的流程以及各程序模块之间的层次调用关系,函数的调用关系图:

3.列出各个功能模块的主要功能及输入输出参数

voidpush(charcc)

初始条件:

输入表达式中的某个符号

操作结果:

将输入的字符存入buf数组中去

BiTreeCreate_RTree()

初始条件:

给出二叉树的定义表达式

操作结果:

构造二叉树的右子树,即存储表达式等号右侧的字符组

BiTreeCreate_RootTree()

初始条件:

给出二叉树的定义表达式

操作结果:

构造存储输入表达式的二叉树,其中左子树存储‘X’,根节点存储‘:

=’

voidPreOrderTraverse(BiTreeT)

初始条件:

二叉树T存在

操作结果:

先序遍历T,对每个节点调用函数Visit一次且仅一次

voidInOrderTraverse(BiTreeT)

初始条件:

二叉树T存在

操作结果:

中序遍历T,对每个节点调用函数Visit一次且仅一次

voidPostOrderTraverse(BiTreeT)

初始条件:

二叉树T存在

操作结果:

后序遍历T,对每个节点调用函数Visit一次且仅一次

intmain()

主函数,调用各方法,操作成功后返回0

(三)调试分析

调试过程中还是出现了一些拼写错误,经检查后都能及时修正。

有些是语法设计上的小错误,比如一些参变量的初始值设置错误,使得程序调试出错。

还有操作符优先级设计不够合理,在输出遍历表达式结果时有错误。

在小组讨论分析后纠正了这些结果,并尽量改进了算法的性能,减小时间复杂度。

有输入表达式建立二叉树的时间复杂度为O(n),先序遍历和中序遍历及后序遍历的时间复杂度都为O(n).

(四)测试结果

X:

=(-b+(b^2-4*a*c)^0.5)/(2*a)

(5)用户手册

打开界面后,根据提示,输入代数表达式,包括包括数字和用字母表示的数,运算符号+-*/^=及括号。

输入完毕回车后系统将显示表达式的前缀式,中缀式,后缀式。

(六)附录

源程序:

#include

#include

#include

typedefstructBiNode

{

chars[20];

structBiNode*lchild,*rchild;

}BiTNode,*BiTree;

charch,bt[1024];

intlen=0;

voidpush(charc)

{

if(len<1024)

bt[len++]=c;

}

BiTreeCreate_RTree()

{

BiTreeT,Q,S;

char*p;

while(ch!

=EOF)

{

ch=getchar();

if(ch=='\n')

{

if(len>0)

{

//输入结束,堆栈中为右节点的值

if((Q=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)

returnNULL;

memset(Q->s,0x00,sizeof(Q->s));

Q->lchild=NULL;

Q->rchild=NULL;

memcpy(Q->s,bt,len);

len=0;

returnQ;

}

returnNULL;

}

elseif(ch=='(')

{

if((Q=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)

returnNULL;

memset(Q->s,0x00,sizeof(Q->s));

Q->rchild=NULL;

Q->lchild=Create_RTree();

ch=getchar();

if(ch=='\n')returnQ;

Q->s[0]=ch;

Q->rchild=Create_RTree();

returnQ;

}

elseif(ch==')')

{

if(len>0)

{

if((Q=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)

returnNULL;

memset(Q->s,0x00,sizeof(Q->s));

Q->lchild=NULL;

Q->rchild=NULL;

memcpy(Q->s,bt,len);

len=0;

returnQ;

}

returnNULL;

}

elseif(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='^')

{

if((T=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)

returnNULL;

if((Q=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)

returnNULL;

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)

returnNULL;

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

returnNULL;

}

else

{

//堆栈中为左节点值

memcpy(T->s,bt,len);

len=0;

}

Q->lchild=T;

Q->s[0]=ch;

if((Q->rchild=Create_RTree())==NULL)

returnNULL;

else

returnQ;

}else

push(ch);

}

returnNULL;

}

BiTNode*Create_RootTree()

{

BiTreeQ,T;

while((ch=getchar())!

=EOF)

{

if(ch=='\n')

{

returnNULL;

}

elseif(ch==':

')//构造根节点:

=

{

ch=getchar();

if(ch!

='=')returnNULL;

if((Q=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)

returnNULL;

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)

returnNULL;

T->lchild=Q;

memset(T->s,0x00,sizeof(T->s));

memcpy(T->s,":

=",2);

//继续处理:

=后面的数据,作为根节点的右节点

if((T->rchild=Create_RTree())==NULL)

returnNULL;

returnT;

}

else

{

push(ch);

}

}

returnNULL;

}

voidPreOrderTraverse(BiTreeT)

{

if(T)

{

printf("%s",T->s);

PreOrderTraverse(T->lchild);

PreOrderTraverse(T->rchild);

}

else

return;

}

voidInOrderTraverse(BiTreeT)

{

if(T)

{

InOrderTraverse(T->lchild);

printf("%s",T->s);

InOrderTraverse(T->rchild);

}

else

{

return;

}

}

voidPostOrderTraverse(BiTreeT)

{

if(T)

{

PostOrderTraverse(T->lchild);

PostOrderTraverse(T->rchild);

printf("%s",T->s);

}

else

return;

}

intmain()

{

printf("请输入一个中缀表达式:

\n");

BiTreeT=NULL;

if((T=Create_RootTree())==NULL)

return0;

printf("先序遍历:

");

PreOrderTraverse(T);

printf("\n");

printf("中序遍历:

");

InOrderTraverse(T);

printf("\n");

printf("后序遍历:

");

PostOrderTraverse(T);

printf("\n");

return0;

}

测试数据结果:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1