二叉树求表达式的值

(一)实验目的

本实验以二叉树的创建与访问算法设计作为实验内容,掌握树型结构的实现方法,培养解决负责问题的能力。

(二)实验内容

1、编写生成二叉树的函数, 二叉树的元素从键盘输入;

2、编写在二叉树中输入表达方式的函数;

3、编写在二叉树中实现表达方式的值的函数;

4、编写遍历并输出二叉树的函数。

(三)实验要求

1、掌握树型结构的机器内表示;

2、掌握树型结构之上的算法设计与实现;

3、列表对比分析两种数据结构的相应操作的时间复杂度、空间复杂度,阐明产生差异的原因。

(四) 实验设计思路

实验采用递归创建二叉树的表达, 并实现了后序遍历二叉数表达式, 既逆波兰表达式的输出, 编写函数计算表达式的值, 并输出。对实验题目进行细分, 逐一实现函数预期的功能, 如下图,先序输入创建二叉树表达式:+*-99##89##2##/66##3##

实验报告

(一) 部分算法流程图

1先序创建二叉树表达式

(五) 程序清单

#i n c l u d e

#i n c l u d e

#i n c l u d e

#d e f i n e l e n 20

#d e f i n e N U L L 0

s t r u c t t r e e

{

c h a r d a t a [l e n ];

t r e e *l c h i l d , *r c h i l d ;

};

v o i d c r e a t e t r e e (t r e e *&t r e ) //创建二叉树

{

c h a r c h [l e n ];

s c a n f (" %s " , c h ) ;

g e t c h a r () ;

i f (s t r c m p (c h , " #" ) ==0) t r e =N U L L ;

e l s e

{

t r e =(t r e e *) m a l l o c (s i z e o f (t r e e ) ) ;

s t r c p y (t r e ->d a t a , c h ) ;

c r e a t e t r e e (t r e ->l c h i l d ) ;

c r e a t e t r e e (t r e ->r c h i l d ) ;

}

}

v o i d i n p u t t r e e (t r e e *t r e ) //输出二叉树

{

i f (t r e ! =N U L L )

{

p r i n t f (" %s " , t r e ->d a t a ) ;

i f (t r e ->l c h i l d ! =N U L L ||t r e ->r c h i l d ! =N U L L )

{

p r i n t f (" (" ) ;

i n p u t t r e e (t r e ->l c h i l d ) ;

i f (t r e ->r c h i l d ! =N U L L ) p r i n t f (" , " ) ;

i n p u t t r e e (t r e ->r c h i l d ) ;

p r i n t f (" ) " ) ;

}

}

}

v o i d t r a v e r s e t r e e (t r e e *t r e ) //后续遍历

{

i f (t r e ! =N U L L )

{

t r a v e r s e t r e e (t r e ->l c h i l d ) ;

t r a v e r s e t r e e (t r e ->r c h i l d ) ;

p r i n t f (" %s " , t r e ->d a t a ) ;

}

}

v o i d i n o r d e r t r a v e r s (t r e e *t r e ) //中续遍历

{

i f (t r e ! =N U L L )

{

t r a v e r s e t r e e (t r e ->l c h i l d ) ;

p r i n t f (" %s " , t r e ->d a t a ) ;

t r a v e r s e t r e e (t r e ->r c h i l d ) ;

}

}

d o u b l e s o l u t i o n (t r e e *t r e ) //二叉树表达式求值

{

i f (t r e ->l c h i l d ==N U L L &&t r e ->r c h i l d ==N U L L &&

t r e ->d a t a [0]>=' 0' &&t r e ->d a t a [0]

r e t u r n a t o f (t r e ->d a t a ) ;

e l s e

{

s w i t c h (t r e ->d a t a [0])

{

c a s e ' *' :r e t u r n

s o l u t i o n (t r e ->l c h i l d ) *s o l u t i o n (t r e ->r c h i l d ) ;

c a s e ' -' :r e t u r n

s o l u t i o n (t r e ->l c h i l d ) -s o l u t i o n (t r e ->r c h i l d ) ;

c a s e ' +' :r e t u r n

s o l u t i o n (t r e ->l c h i l d ) +s o l u t i o n (t r e ->r c h i l d ) ;

c a s e ' /' :r e t u r n

s o l u t i o n (t r e ->l c h i l d ) /s o l u t i o n (t r e ->r c h i l d ) ;

}

}

}

i n t m a i n ()

{

t r e e *t r e ;

d o u b l e s u m ;

i n t c h ;

d o

{

p r i n t f (" ………………选择下面功能……………………\n " ) ; p r i n t f (" 1. 先序创建二叉数表达式 \n " ) ; p r i n t f (" 2. 后序遍利二叉数表达式 \n " ) ; p r i n t f (" 3. 求二叉数表达式的数值 \n " ) ; p r i n t f (" 4. 中序遍利二叉数表达式 \n " ) ; p r i n t f (" 5. 退出二叉数 \n " ) ; p r i n t f (" ……………………………………………………\n " ) ; s c a n f (" %d " , &c h ) ;

s w i t c h (c h )

{

c a s e 1:

p r i n t f (" 输入创建的二叉树:\n " ) ; g e t c h a r () ; c r e a t e t r e e (t r e ) ; i n p u t t r e e (t r e ) ;

p r i n t f (" \n " ) ; b r e a k ;

c a s e 2:

p r i n t f (" 后序遍历的二叉树:\n " ) ;

t r a v e r s e t r e e (t r e ) ; p r i n t f (" \n " ) ; b r e a k ;

c a s e 3:

s u m =s o l u t i o n (t r e ) ; p r i n t f (" 二叉树表达式

的值为=%l f \n " , s u m ) ; b r e a k ;

c a s e 4:

p r i n t f (" 中序遍历的二叉树:\n " ) ;

i n o r d e r t r a v e r s (t r e ) ; p r i n t f (" \n " ) ; b r e a k ;

c a s e 5: b r e a k ;

}

}w h i l e (c h ! =5) ;

r e t u r n 0;

}

(六)实验结果

………………选择下面功能……………………

1. 先序创建二叉数表达式

2. 后序遍利二叉数表达式

3. 求二叉数表达式的数值

4. 中序遍利二叉数表达式

5. 退出二叉数

……………………………………………………

1

输入创建的二叉树:

+

*

-

99

#

#

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

请按任意键继续. . .

(七)实验遇到的问题

二叉树的递归创建只能先序创建吗?若采用中序或后序创建,必须先输入左子树,我们所定义二叉树往电脑输入时,必须有终止条件,比如if(strcmp(ch,"#")==0)tre=NULL;所以,一颗二叉树中序或后序建立时,必先输入左子树,而左子树是终止条件,所以,无法建立一颗二叉树。

(一)实验目的

本实验以二叉树的创建与访问算法设计作为实验内容,掌握树型结构的实现方法,培养解决负责问题的能力。

(二)实验内容

1、编写生成二叉树的函数, 二叉树的元素从键盘输入;

2、编写在二叉树中输入表达方式的函数;

3、编写在二叉树中实现表达方式的值的函数;

4、编写遍历并输出二叉树的函数。

(三)实验要求

1、掌握树型结构的机器内表示;

2、掌握树型结构之上的算法设计与实现;

3、列表对比分析两种数据结构的相应操作的时间复杂度、空间复杂度,阐明产生差异的原因。

(四) 实验设计思路

实验采用递归创建二叉树的表达, 并实现了后序遍历二叉数表达式, 既逆波兰表达式的输出, 编写函数计算表达式的值, 并输出。对实验题目进行细分, 逐一实现函数预期的功能, 如下图,先序输入创建二叉树表达式:+*-99##89##2##/66##3##

实验报告

(一) 部分算法流程图

1先序创建二叉树表达式

(五) 程序清单

#i n c l u d e

#i n c l u d e

#i n c l u d e

#d e f i n e l e n 20

#d e f i n e N U L L 0

s t r u c t t r e e

{

c h a r d a t a [l e n ];

t r e e *l c h i l d , *r c h i l d ;

};

v o i d c r e a t e t r e e (t r e e *&t r e ) //创建二叉树

{

c h a r c h [l e n ];

s c a n f (" %s " , c h ) ;

g e t c h a r () ;

i f (s t r c m p (c h , " #" ) ==0) t r e =N U L L ;

e l s e

{

t r e =(t r e e *) m a l l o c (s i z e o f (t r e e ) ) ;

s t r c p y (t r e ->d a t a , c h ) ;

c r e a t e t r e e (t r e ->l c h i l d ) ;

c r e a t e t r e e (t r e ->r c h i l d ) ;

}

}

v o i d i n p u t t r e e (t r e e *t r e ) //输出二叉树

{

i f (t r e ! =N U L L )

{

p r i n t f (" %s " , t r e ->d a t a ) ;

i f (t r e ->l c h i l d ! =N U L L ||t r e ->r c h i l d ! =N U L L )

{

p r i n t f (" (" ) ;

i n p u t t r e e (t r e ->l c h i l d ) ;

i f (t r e ->r c h i l d ! =N U L L ) p r i n t f (" , " ) ;

i n p u t t r e e (t r e ->r c h i l d ) ;

p r i n t f (" ) " ) ;

}

}

}

v o i d t r a v e r s e t r e e (t r e e *t r e ) //后续遍历

{

i f (t r e ! =N U L L )

{

t r a v e r s e t r e e (t r e ->l c h i l d ) ;

t r a v e r s e t r e e (t r e ->r c h i l d ) ;

p r i n t f (" %s " , t r e ->d a t a ) ;

}

}

v o i d i n o r d e r t r a v e r s (t r e e *t r e ) //中续遍历

{

i f (t r e ! =N U L L )

{

t r a v e r s e t r e e (t r e ->l c h i l d ) ;

p r i n t f (" %s " , t r e ->d a t a ) ;

t r a v e r s e t r e e (t r e ->r c h i l d ) ;

}

}

d o u b l e s o l u t i o n (t r e e *t r e ) //二叉树表达式求值

{

i f (t r e ->l c h i l d ==N U L L &&t r e ->r c h i l d ==N U L L &&

t r e ->d a t a [0]>=' 0' &&t r e ->d a t a [0]

r e t u r n a t o f (t r e ->d a t a ) ;

e l s e

{

s w i t c h (t r e ->d a t a [0])

{

c a s e ' *' :r e t u r n

s o l u t i o n (t r e ->l c h i l d ) *s o l u t i o n (t r e ->r c h i l d ) ;

c a s e ' -' :r e t u r n

s o l u t i o n (t r e ->l c h i l d ) -s o l u t i o n (t r e ->r c h i l d ) ;

c a s e ' +' :r e t u r n

s o l u t i o n (t r e ->l c h i l d ) +s o l u t i o n (t r e ->r c h i l d ) ;

c a s e ' /' :r e t u r n

s o l u t i o n (t r e ->l c h i l d ) /s o l u t i o n (t r e ->r c h i l d ) ;

}

}

}

i n t m a i n ()

{

t r e e *t r e ;

d o u b l e s u m ;

i n t c h ;

d o

{

p r i n t f (" ………………选择下面功能……………………\n " ) ; p r i n t f (" 1. 先序创建二叉数表达式 \n " ) ; p r i n t f (" 2. 后序遍利二叉数表达式 \n " ) ; p r i n t f (" 3. 求二叉数表达式的数值 \n " ) ; p r i n t f (" 4. 中序遍利二叉数表达式 \n " ) ; p r i n t f (" 5. 退出二叉数 \n " ) ; p r i n t f (" ……………………………………………………\n " ) ; s c a n f (" %d " , &c h ) ;

s w i t c h (c h )

{

c a s e 1:

p r i n t f (" 输入创建的二叉树:\n " ) ; g e t c h a r () ; c r e a t e t r e e (t r e ) ; i n p u t t r e e (t r e ) ;

p r i n t f (" \n " ) ; b r e a k ;

c a s e 2:

p r i n t f (" 后序遍历的二叉树:\n " ) ;

t r a v e r s e t r e e (t r e ) ; p r i n t f (" \n " ) ; b r e a k ;

c a s e 3:

s u m =s o l u t i o n (t r e ) ; p r i n t f (" 二叉树表达式

的值为=%l f \n " , s u m ) ; b r e a k ;

c a s e 4:

p r i n t f (" 中序遍历的二叉树:\n " ) ;

i n o r d e r t r a v e r s (t r e ) ; p r i n t f (" \n " ) ; b r e a k ;

c a s e 5: b r e a k ;

}

}w h i l e (c h ! =5) ;

r e t u r n 0;

}

(六)实验结果

………………选择下面功能……………………

1. 先序创建二叉数表达式

2. 后序遍利二叉数表达式

3. 求二叉数表达式的数值

4. 中序遍利二叉数表达式

5. 退出二叉数

……………………………………………………

1

输入创建的二叉树:

+

*

-

99

#

#

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

请按任意键继续. . .

(七)实验遇到的问题

二叉树的递归创建只能先序创建吗?若采用中序或后序创建,必须先输入左子树,我们所定义二叉树往电脑输入时,必须有终止条件,比如if(strcmp(ch,"#")==0)tre=NULL;所以,一颗二叉树中序或后序建立时,必先输入左子树,而左子树是终止条件,所以,无法建立一颗二叉树。


相关内容

  • 基于二叉树的算术表达式计算与实现
  • 科技教育创新 Education DOI:10.3969/j.issn.1001-8972.2012.13.135 中国科技信息2012年第13期 CHINA SCIENCE AND TECHNOLOGY INFORMATION Jul.2012 基金项目:高职高专计算机类专业2012年度规划课题( ...

  • MATLAB符号表达式运算
  • 一旦创建了一个符号表达式,或许想以某些方式改变它:也许希望提取表达式的一部分,合并两个表达式或求得表达的数值.有许多符号工具可以帮助完成这些任务. 所有符号函数(很少特殊例外的情况,讨论于后)作用到符号表达式和符号数组,并返回符号表达式或数组.其结果有时可能看起来象一个数字,但事实上它是一个内部用字 ...

  • 算术表达式与二叉树
  • 目录 一.系统开发的背景 ................................................................................................................ 1 二.系统分析与设计 ............ ...

  • C语言运算符的优先级.结合方向.使用形式等详细列表
  • 4 + 加 表达式+表达式 左到右 双目运算符 双目运算符 - 减 表达式-表达式 5 双目运算符 双目运算符 >> 右移 变量>>表达式 6 > 大于 表达式>表达式 左到右 双目运算符 双目运算符 双目运算符 双目运算符 >= 大于等于 表达式>= ...

  • js正则表达式
  • 正则表达式可以: •测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证 •替换文本.可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字 •根据模式匹配从字符串中提取一个子字符串. ...

  • AT&T汇编语言
  • AT&T ASM 1 AT&T ASM 开发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由于启动部分的代码有大小限制,使用精练的汇编可以缩小目标代码的尺寸.另外,对于某些需要被经常调用的代码,使用汇编可以提高性能. ...

  • php正则表达式
  • /** *描述字符串的自定义规则:分割,匹配,替换,能用字符串处理函数完成的就不要使用正则. *通过构建特定模式,与字符串比较,然后处理. *1.是个字符串. *2.有具有特殊意义的字符组成. *3.具有编写规则,是种模式 *4.可以看做是一种编程语言. *5.正则表达式放在函数中使用才能发挥作用. ...

  • 正则表达式不包含属性
  • iOS中使用正则表达式NSRegularExpression 来验证textfiled输入的内容 一个正则表达式(regexp)是由元字符和文字数字的文本字符,或者"文字的("abc,123,及其他)混合组合而成的文本模式. 该类型用于匹配文本字符--并附有匹配的结果,是成功还是 ...

  • 探究弹性势能的表达式
  • 第七章第五节 探究弹性势能的表达式 河北行唐一中物理组 王海霞 教材分析: 本节课是一节不包含实验的探究课,是重力势能后的进一步拓展.让学生在变力作用下进行功能关系的探究,功是能量变化的量度,既然重力势能的表达式是通过重力做功分析得来的,很自然的想到弹性势能的表达式可以通过弹力做功分析得到.通过对两 ...