表达式二叉树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;