表达式二叉树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第4次上机实习报告

2 数据结构与算法实习报告

诚信保证:我保证没有抄袭他人作业!问题部分

1.1 问题描述

【1】对于任意给出的前缀表达式(不带括号)、中缀表达式(可以带括号)或后缀表达式(不带括号),能够在计算机内部构造出一棵表达式二叉树,并且图示出来(图形的形式)。

【2】对于构造好的内部表达式二叉树,按照用户的要求输出相应的前缀表达式(不带括号)、中缀表达式(可以带括号,但不允许冗余括)或后缀表达式(不带括号)。

(2)输入输出要求:

请输入表达式类型;请输入表达式类型,前缀表达式输入-1,中缀表达式输入0,后缀表达式输入1.

请输入字符串表达式:

树形二叉树(图形显示)

中缀表达式为:

前缀表达式为:

后缀表达式为:

1.2 问题分析

一、前缀、中缀、后缀表达式->二叉树表达式

数据结构实习报告前缀表达式->二叉树表达式:从后往前扫描

(a)碰到操作数则把其值赋给相应的新申请的二叉树结点,地址压栈;

(b)碰到操作符则把其值赋给相应的新申请的二叉树,若栈非空,从栈中弹出一个地址,则栈顶指针所指结点设置成当前结点左孩子,若栈非空,再从栈中弹出一个地址,则栈顶指针所指结点设置成当前结点右孩子,操作完毕后把当前节点压栈,最后一个地址即为二叉树的根结点地址。

中缀表达式->二叉树表达式:把中缀表达式转换成后缀表达式,然后再建立二叉树。

后缀表达式->二叉树表达式:从前往后扫描

(a)碰到操作数则把其值赋给相应的新申请的二叉树结点,若栈为空则地址压栈,

(b)碰到操作符则把其值赋给相应的新申请的二叉树结点,若当前元素的左孩子为空则设为其左孩子,左孩子为满则设为其右孩子,开始那个元素地址为根结点地址,开始时用变量root保存。

二、二叉树表达式->前缀、中缀、后缀表达式

二叉树表达式->前缀表达式:对二叉树表达式进行前序遍历。

二叉树表达式->中缀表达式:对二叉树表达式进行中序遍历,如果当前节点的左子树是运算符,且运算符优先级低于当前运算符,那么左边的表达式要先计算,需要加括号,否则直接输出左子树;如果当前节点的右子树是运算符,且运算符优先级不高于当前运算符,那么右边的表达式要先计算,需要加括号,狗则直接输出右子树。

4 数据结构与算法实习报告

二叉树表达式->后缀表达式:对二叉树表达式进行后序遍历。

2 实现部分

2.1 实现方法分析

节点类TNode:包含操作符oper、左孩子left、右孩子right,isOper()判断是否为操作符,getOperOrder()返回运算符op所对应的优先级,freeTree()程序结束销毁二叉树,postOrder()先序遍历,preOrder()后序遍历,inOrder ()中序遍历并输出不带冗余括号的中缀表达式,post2tree()后缀表达式生成二叉树,pre2tree()前缀表达式生成二叉树,in2tree()中后缀表达式生成二叉树,count()求树的层数用于打印树做辅助,paint()打印

2.2 测试效果分析

------------function start-----------------

请输入表达式类型,前缀表达式输入-1,中缀表达式输入0,后缀表达式输入1.

请输入字符串表达式:

(a+b)*c-d

数据结构实习报告 -

* d

+ c

a b

中缀表达式为:(a+b)*c-d

前缀表达式为:-*+abcd

后缀表达式为:ab+c*d-

----------function end-----------

Press any key to continue

------------function start-----------------

请输入表达式类型,前缀表达式输入-1,中缀表达式输入0,后缀表达式输入1.

-1

请输入字符串表达式:

-*+abcd

-

* d

6 数据结构与算法实习报告

+ c

a b

中缀表达式为:(a+b)*c-d

前缀表达式为:-*+abcd

后缀表达式为:ab+c*d-

----------function end-----------

Press any key to continue

------------function start-----------------

请输入表达式类型,前缀表达式输入-1,中缀表达式输入0,后缀表达式输入1.

1

请输入字符串表达式:

ab+c*d-

-

* d

+ c

数据结构实习报告

a b

中缀表达式为:(a+b)*c-d

前缀表达式为:-*+abcd

后缀表达式为:ab+c*d-

----------function end-----------

Press any key to continue

3 报告总结

在建树的时候要特别注意用到栈来实现节点顺序的改变,从而实现小树建造大树的过程。前序建树和中序建树的过程的差别也特别值得注意。用树的图形输出树实在是不会写,借鉴的别人的程序。

程序:

#include

#include

#include

#include

#include

using namespace std;

class TNode//节点类

{ public:

char oper;//数据域,为简便起见,操作数用单个字符代替

TNode *left;

TNode *right;

相关文档
最新文档