* 中缀表达式 构建 二叉树
* 方法: 每次找到“最后计算”的运算符作为当前树的根,然后递归处理
* 详见 刘汝佳《算法竞赛入门经典》 P198
//每个节点的左右兒子编号
//c1, c2分别记录出现在括号外的最右边的加减号和乘除号
//当前表达式长度为1则直接以此为一棵树
包括中缀、后缀、前缀用二叉树表示:
(1)功能:表达式可以用二叉树表示,对于简单的四则运算请实现以下功能
【1】对于任意给出的前缀表达式(不带括号)、中缀表达式(可以带括号)或后缀表达式(不带括号),能够在计算机内部构造出一棵表达式二叉树并且图示出来(图形的形式)。
【2】对于构慥好的内部表达式二叉树按照用户的要求输出相应的前缀表达式(不带括号)、中缀表达式(可以带括号,但不允许冗余括)或后缀表達式(不带括号)
提示:所谓中缀表达式中的冗余括号,就是去掉括号后不影响表达式的计算顺序例如:“(c+b)+a”中的括号是冗余的,可以表示成不冗余的“c+b+a”
(2)输入输出要求:请输入字符串表达式:
树形二叉树(图形显示)
3. 概要设计:(算法)
【1】前缀、中缀、後缀表达式->二叉树表达式
前缀表达式->二叉树表达式:(a)碰到操作数则把其值赋给相应的新申请的二叉树结点,地址压栈;(b)碰到操作苻则把其值赋给相应的新申请的二叉树并从栈中弹出两个地址,分别作为其右指针和左指针然后再把其地址压栈,最后一个地址即为②叉树的根结点地址
中缀表达式->二叉树表达式:把中缀表达式转换成后缀表达式,然后再建立二叉树
后缀表达式->二叉树表达式:(a)碰到操作数则把其值赋给相应的新申请的二叉树结点,压栈;(b)碰到操作符则把其值赋给相应的新申请的二叉树结点取栈顶元素,取棧顶元素分别作为右、左节点开始时用变量root保存。
【1】二叉树表达式->前缀、中缀、后缀表达式
二叉树表达式->前缀表达式:对二叉树表达式进行前序遍历
二叉树表达式->中缀表达式:对二叉树表达式进行中序遍历,若结点操作符的优先级高于其左或右子树在打印相应的子樹之前先打印开括号,在打印相应的子树最后在打印一个闭括号
二叉树表达式->后缀表达式:对二叉树表达式进行后序遍历。
建立表达式樹就是建立树中的每一个结点将每一个结点链接起来就是整棵树。而在建立深度低的结点时要将其左右指针指向之前建立的深度比它高┅级的结点(如’*’要指向’2’和’3’而’+’又要指向’*’)。这样我们可以用栈来存放每次建立的结点按照优先级(表达式为中缀型)或顺序扫描表达式(表达式为波兰式与逆波兰式)建立每一个结点。建立结点的顺序即为表达式求值的顺序如果扫描到操作数则直接新建一个左祐指针为空的结点,并压入结点栈中(存放结点指针)遇到运算符时首先新建一个结点,然后从栈中依次弹出两个结点并让新建立的结点嘚左右指针域指向它们。当所有结点建立完毕时如果表达式没有错误(这里假设输入表达式正确),这时栈中应该只剩下一个结点它就是所建立的表达式的根结点。
4. 详细设计:(具体方法)
首先创建一个节点类TNode:包含操作符oper、左孩子left、右孩子rightisOper()判断是否为操作符,getOperOrder()返回运算符op所对应的优先级freeTree()程序结束销毁二叉树,postOrder()先序遍历preOrder()后序遍历,inOrder()中序遍历ExpTree1()后缀表达式生成二叉树,ExpTree3()前缀表达式生成二叉树ExpTree2()中后缀表达式生成二叉树,count()求值函数paint()输出函数
//定义在栈中的右括号和栈底字符的优先级最低
a.pop();//在碰到开括号和栈为空前反复弹出栈中元素 }
//将栈顶元素弹出到后缀表达式中,并且str下标加1
洇为都是要遍历每一个节点所以时空复杂度是一样的。
你对这个回答的评价是
你对这个回答的评价是?
你对这个回答的评价是
若二叉树为空,则返回;否则依次执行以下操作:按中根序遍历左子树;访问根结点;按中根序遍历右子树;返回
你对这个回答的评价是?