二叉树求表达式的值.docx
- 文档编号:5838871
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:8
- 大小:20.61KB
二叉树求表达式的值.docx
《二叉树求表达式的值.docx》由会员分享,可在线阅读,更多相关《二叉树求表达式的值.docx(8页珍藏版)》请在冰豆网上搜索。
二叉树求表达式的值
(一)实验目的
本实验以二叉树的创建与访问算法设计作为实验容,掌握树型结构的实现方法,培养
解决负责问题的能力。
(二)实验容
1、编写生成二叉树的函数,二叉树的元素从键盘输入;
2、编写在二叉树中输入表达方式的函数;
3、编写在二叉树中实现表达方式的值的函数;
4、编写遍历并输出二叉树的函数。
(三)实验要求
1、掌握树型结构的机器表示;
2、掌握树型结构之上的算法设计与实现;
3、列表对比分析两种数据结构的相应操作的时间复杂度、空间复杂度,阐明产生差异
的原因。
(四)实验设计思路
实验采用递归创建二叉树的表达,并实现了后序遍历二叉数表达式,既逆波兰表达式的
输出,编写函数计算表达式的值,并输出。
对实验题目进行细分,逐一实现函数预期的功能,如
下图,先序输入创建二叉树表达式:
+*-99##89##2##/66##3##
输出结果:
42
2
实验报告
(一)部分算法流程图
1先序创建二叉树表达式
(五)程序清单
#include
#include
#includevstring.h>
#definelen20
#defineNULL0structtree
{
chardata[len];
tree*lchild,*rchild;
};
voidcreatetree(tree*&tre)//创建二叉树
{
charch[len];
scanf(”%s",ch);
getchar();
if(strcmp(ch,"#")==0)tre=NULL;
else
{
tre=(tree*)malloc(sizeof(tree));strcpy(tre->data,ch);
createtree(tre->lchild);
createtree(tre->rchild);
}
}voidinputtree(tree*tre)//输出二叉树{
if(tre!
=NULL)
{
printf("%s",tre->data);
NULL)
if(tre->lchild!
=NULL||tre->rchild!
printf("(");
inputtree(tre->Ichild);
if(tre->rchiId!
=NULL)printf(",");
inputtree(tre->rchiId);
printf(")");
}
}
}voidtraversetree(tree*tre)//后续遍历{
if(tre!
=NULL)
{
traversetree(tre->lchild);
traversetree(tre->rchild);
printf("%s",tre->data);
}
}voidinordertravers(tree*tre)//中续遍历
if(tre!
=NULL)
traversetree(tre->Ichild);
printf("%s",tre->data);
traversetree(tre->rchild);
}
}doublesolution(tree*tre)//二叉树表达式求值
{
if(tre->lchild==NULL&&tre->rchild==NULL&&tre->data[O]>='O'&&tre->data[0]<='9')
returnatof(tre->data);
else
{
switch(tre->data[0])
>rchild);
>rchild);
->rchild);
{
case'*':
returnsolution(tre->lchild)*solution(tre-case'-':
returnsolution(tre->lchild)-solution(tre-case'+':
returnsolution(tre->lchild)+solution(trecase'/':
returnsolution(tre->lchild)/solution(tre->rchild);
intmain()
{
tree*tre;
doublesum;
intch;do
rintf("
选择下面功能
…n");
rintf("
1.先序创建二叉数表达式
n"
rintf("
2.后序遍利二叉数表达式
n"
rintf("
3.求二叉数表达式的数值
n"
rintf("
4.中序遍利二叉数表达式
n"
rintf("
5.退出二叉数
n"
rintf("
…n")
P
);
P
);
P
);
P
);
P
);
P
P
scanf("%d",&ch);
switch(ch)
case1:
printf(”输入创建的二叉树:
n");getchar();
createtree(tre);inputtree(tre);
printf("n");break;
case2:
printf("后序遍历的二叉树:
n");
traversetree(tre);printf("n”);break;
case3:
sum=solution(tre);printf("二叉树表达式的值为=%fn",sum);break;
case4:
printf("中序遍历的二叉树:
n");
inordertravers(tre);printf(”n");break;case5:
break;
}
}while(ch!
=5);
return0;
}
(六)实验结果
选择下面功能
1.先序创建二叉数表达式
2.后序遍利二叉数表达式
3.求二叉数表达式的数值
4.中序遍利二叉数表达式
5.退出二叉数
输入创建的二叉树:
+
89
#
#
2
#
#
/
66
#
#
3
#
#+(*(-(99,89),2),/(66,3))
选择下面功能•
1.
先
序
创
建二叉
数
表
达
式
2.
后
序
遍
利二叉
数
表
达
式
3.
求
-二二
叉
数表达
式
的
数
值
4.
中
序
遍
利二叉
数
表
达
式
5.退
岀:
二叉数
2
后序遍历的二叉树:
9989-2*663/+
选择下面功能
1.
先
序
创
建二叉
数
表
达
式
2.
后
序
遍
利二叉
数
表
达
式
3.
求
■二二
叉
数表达
式
的
数
值
4.
中
序
遍
利二叉
数
表
达
式
5.退
岀:
二叉数
4
中序遍历的二叉树:
9989-2*+663/
选择下面功能
1.先序创建二叉数表达式
2.后序遍利二叉数表达式
3.求二叉数表达式的数值
4.中序遍利二叉数表达式
5.退出二叉数
3
二叉树表达式的值为=42.000000
选择下面功能
1.先序创建二叉数表达式
2.后序遍利二叉数表达式
3.求二叉数表达式的数值
4.中序遍利二叉数表达式
5.退出二叉数
5
请按任意键继续
(7)实验遇到的问题
二叉树的递归创建只能先序创建吗?
若采用中序或后序创建,必须先输入左子树,我
们所定义二叉树往电脑输入时,必须有终止条件,比如if(strcmp(ch,"#")==0)tre=NULL;所以,
一颗二叉树中序或后序建立时,必先输入左子树,而左子树是终止条件,所以,无法建立一颗二叉树。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 表达式