机房号 10-414
姓名:
日期: 2018/11/21
程序名: 二叉树的遍历与表达式计算
实验内容: (二)二叉树的遍历
一、目的和要求(需求分析):
1、将表达式二叉树方式存入数组,以递归方式建立表达式之二叉树状结构,再分别输
出前序、中序及后序遍历结果,并计算出表达式之结果。
二、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
1.程序结构:由先序遍历,中序遍历,后序遍历,先序遍历构建二叉树,计算表达式,构成函数,main构成主函数。
2.原理:
1.先序遍历二叉树的操作:若二叉树为空,则空操作;否则 (1)访问根结点; (2)先序遍历左子树;(3)先序遍历右子树。
printf("%c",t->data);
FirstTransverse(t->lchild);
FirstTransverse(t->rchild);
2.中序遍历二叉树的操作: 若二叉树为空,则空操作;否则 (1)中序遍历左子树; (2) 访问根结点;(3) 中序遍历右子树。
MidTransverse(t->lchild);
printf("%c",t->data);
MidTransverse(t->rchild);
3. 后序遍历二叉树的操作: 若二叉树为空,则空操作;否则; (1)后序遍历左子树; (2)后序遍历右子树; (3)访问根结点。
FirstTransverse(t->lchild);
FirstTransverse(t->rchild);
printf("%c",t->data);
三、调试和运行程序过程中产生的问题及采取的措施:
1.后序遍历时,因为输错了左右子树的位置,导致输出结果错误,调试了很久,终于找到错误并改正。
2.在编写计算表达式的值时,遇到了瓶颈,始终找不到程序的问题所在,也尝试了别的方法,并没有成功的运行计算表达式的值。
四、源程序及注释:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
char data;
struct Node *lchild, *rchild;
}Node;//构建结构体
void FirstTransverse(Node *t){
if(t==NULL){
return;
}
printf("%c",t->data);
FirstTransverse(t->lchild);
FirstTransverse(t->rchild);
}//先序遍历
void MidTransverse(Node *t){
if(t==NULL){
return;
}
MidTransverse(t->lchild);
printf("%c",t->data);
MidTransverse(t->rchild);
} //中序遍历
void LastTransverse(Node *t){
if(t==NULL){
return;
}
FirstTransverse(t->lchild);
FirstTransverse(t->rchild);
printf("%c",t->data);
} //后序遍历
Node *PreCreateBitree(Node *t){
char ch;
ch=getchar();
if(ch=='#'){ //空标志
t=NULL;
}
else{
t=(Node *)malloc(sizeof(Node));
t->data=ch;
t->lchild=PreCreateBitree(t->lchild);
t->rchild=PreCreateBitree(t->rchild);
}
return t;
}//利用先序遍历构建二叉树
int calculate(Node *t)
{
printf("%c",t->data);
FirstTransverse(t->lchild);
FirstTransverse(t->rchild);
printf("=");
if(t==NULL)
{
return 0;
}
if(t->data <='9'&&t->data >='0')//数据为数字时
{
return (t->data-'0');
}
else
{
switch(t->data)//运算符号的情况
{
case'+': return calculate(t->lchild) + calculate(t->rchild); // +
case'-': return calculate(t->lchild) - calculate(t->rchild); // -
case'*': return calculate(t->lchild) * calculate(t->rchild); // *
case'/': return calculate(t->lchild) / calculate(t->rchild); // /
}
}
printf("%c",t->lchild);
}
int main()
{
Node *t=NULL;
t=PreCreateBitree(t);
printf("\n先序遍历:\n");
FirstTransverse(t); //先序遍历
printf("\n\n中序遍历:\n");
MidTransverse(t);//中序遍历
printf("\n\n后序遍历:\n");
LastTransverse(t);// 后序遍历
printf("\n\n计算表达式:\n");
calculate(t); //计算表达式
printf("\n");
return 0;
}
五、运行输出结果:
六、心得与体会:
未能完成表达式的计算