树和二叉树的实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档