《数据结构与算法》实验二报告//二叉树的遍历

机房号 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; 
}

五、运行输出结果:

在这里插入图片描述

六、心得与体会:

未能完成表达式的计算

发布了35 篇原创文章 · 获赞 1 · 访问量 1859

猜你喜欢

转载自blog.csdn.net/qq_40672635/article/details/90049936
今日推荐