二叉树:表达式二叉树转换成中缀式(括弧处理)
文章目录
- 问题描述 :
- 输入说明 :
- 输出说明 :
- 输入范例 :
- 输出范例 :
- 思路分析
- 代码实现
- 事故现场
- 第一次提交
- 分析与总结
- 如果不妥请留言,你的关注和回复是对我最大的鼓励,谢谢!如果想立即回复,可以加扣扣651378276,一起商量学习进步!!
问题描述 :
内容:(1)请参照链表的ADT模板,设计二叉树并逐步完善的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的链表ADT原型文件,自行设计二叉树的ADT。)
注意:二叉树ADT的基本操作的算法设计很多要用到递归的程序设计方法。
(2)ADT的简单应用:使用该ADT设计并实现若干应用二叉树的算法设计。
应用:要求设计一个算法,将表达式二叉树转换成原始的中缀表达式(括号恢复)。二叉树的存储结构的建立参见二叉树应用1。
注意:假定输入的中缀表达式为合法的表达式。仅考虑有小括弧的场合。运算符包括+、-、*、/,运算数为整数(不局限于个位数)。
参考函数原型:
(1)表达式二叉树转换成中缀式 (外壳部分,用户函数)
//表达式二叉树转换成中缀式template<class ElemType>void BianryTree_Infix(BinaryTree<ElemType> &T, string &inffix); //inffix:转换获得的中缀表达式字符串
(2)表达式二叉树转换成中缀式 (递归部分,用户函数)
//表达式二叉树转换中缀表达式
template<class ElemType>void BianryTree_Infix_Cursive(BinaryTreeNode<ElemType> *root, string &inffix);
辅助函数:
(1)判断是否为运算符(用户函数)
//判断是否为运算符 bool isoperator( char op ){switch(op){case '+':case '-':case '*':case '/':case '(':case ')':return true;default:return false;}}
(2)求运算符的优先级(用户函数)
//求运算符的优先级int getOperPri(char op) { switch(op) { case '(': return 1; break; case '+': case '-': return 2; break; case '*': case '/': return 3; break; default: return 0; } }
输入说明 :
第一行:表示无孩子或指针为空的特殊分隔符
第二行:二叉树的先序序列(结点元素之间以空格分隔)
输出说明 :
第一行:中缀表达式字符串(不带空格)
输入范例 :
#
* - + + 12 # # 14 # # 3 # # / 400 # # / 30 # # * 10 # # 5 # # 62 # #
输出范例 :
(12+14+3-400/(30/(10*5)))*62
思路分析
这和那个后序遍历生成二叉树,然后转成带括号的中缀式不是很像吗?传送门
所以先把那个代码拿过来跑一下!
效果如下
实际答案
- 显而易见的,±*/四个符号不是都满足交换律的,所以针对不满足交换律的减法和除法,要给它一个方向性
- 根据上图可以看出,如果是只要是减法或者乘法的右子树是与其优先级同样的,或者比其低的,都要加括号,这就很好办了
代码实现
bool InOrderRur(BinaryTreeNode *root,bool (*visit)(BinaryTreeNode *temp)){if(root) {char temp=' ',left= ' ',right=' ';if(root->GetLChild() &&root->GetRChild()){temp = root->getData().at(0);left = root->GetLChild()->getData().at(0);right = root->GetRChild()->getData().at(0);}if(isoperator(left)&& getOperPri(left)<getOperPri(temp)){cout<<"(";InOrderRur(root->GetLChild(),visit2);cout<<")";}else{InOrderRur(root->GetLChild(),visit2);}visit2(root);if(isoperator(right)&& getOperPri(right)<getOperPri(temp)){cout<<"(";InOrderRur(root->GetRChild(),visit2);cout<<")";}else if((temp == '-' && isoperator(right)) &&(getOperPri(temp) >= getOperPri(right))){cout<<"(";InOrderRur(root->GetRChild(),visit2);cout<<")";}else if(temp == '/' && isoperator(right)){cout<<"(";InOrderRur(root->GetRChild(),visit2);cout<<")";}else{InOrderRur(root->GetRChild(),visit2);}return true;}return false;
}
事故现场
第一次提交
- 谁能跟我讲发生了什么?卧槽,这道题是难度为难的题目吗?给我高兴坏了,真的高兴坏了!肯定是老师看错了,绝对的!!!
分析与总结
- 还是一开始出发的思路找对了,后面就好做了。除此之外,自己要在纸上想好大概的思路,再去完成,不是啥都没有就开始做的。
- 关于很多数字的细节问题,如果一瞬间想不清楚,就不要想,上机debug看出所有的变化,直接找出临界值就行。
如果不妥请留言,你的关注和回复是对我最大的鼓励,谢谢!如果想立即回复,可以加扣扣651378276,一起商量学习进步!!
二叉树:表达式二叉树转换成中缀式(括弧处理)相关推荐
- 将表达式树转换成中缀表达式☆
题目:请设计一个算法,将给定的表达式树,转换成等价的中缀表达式并输出. 分析: 题目已然说明我们要采取中序遍历,进而输出该表达式,那么需要注意的点便是我们的括号在哪里加,其中根节点处( ...
- SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式
数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...
- 一般算术表达式转换成后缀式
数据结构实验之栈与队列二:一般算术表达式转换成后缀式 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以'#'字符作为结束标志. Output 输出 ...
- c 语言表达式求值中缀变后缀,表达式求值关于中缀式转后缀式的问题!
已结贴√ 问题点数:10 回复次数:6 表达式求值关于中缀式转后缀式的问题! 本人看资料的时候遇到一段代码,这段代码中转为后缀式的优先级那句不明白,请大神赐教,代码如下(c语言) #include # ...
- php 下划线转大写开头,使用PHP把下划线分隔命名的字符串 转换成驼峰式命名方式 , 把下划线后面的第一个字母变成大写...
最近项目使用symfony框架,这个框架对数据库的操作在这个团队里使用的是ORM进行操作,说实话使用ORM的开发效率和运行效率不一定高多少,到是它的实体命名和现有数据库字段的命名不太一样,ORM实体属 ...
- 要求实现编译器的以下功能: (1) 按规则拼单词,并转换成二元式形式 (2) 删除注释行 (3) 删除空白符 (空格、回车符、制表符) (4) 列表打印源程序,按照源程序的行打印,在每行的前面加上行号
目录 目录 2 1 实验目的··· 3 2 实验内容··· 3 2.1 TINY计算机语言描述··· 3 2.2 实验要求··· 3 3 此法分析器的程序实现··· 4 3.1 状态转换图··· ...
- 每天一道LeetCode-----将二叉树原地平铺成链式结构
Flatten Binary Tree to Linked List 原题链接Flatten Binary Tree to Linked List 给定一个二叉树,将其原地平铺成链式结构(按先序遍历的 ...
- SDUT OJ 2132 (一般算术表达式转换成后缀式)
题目描述 Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以'#'字符作为结束标志. Output 输出该表达式转换所得到的 ...
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以'#'字符作为结束标志. Output 输出该表达式转换所得到的后缀式. ...
最新文章
- java代码 将字符串快速生成到string.xml中
- python curses_用 Python 进行 Curses 编程
- python 批量处理文件重命名
- pycharm 怎么查看函数信息?
- python数值运算符也叫内置运算符_Python全栈工程师(数值类型、运算符)
- 递归删除目录下.svn文件
- 解决@vue/cli 创建项目是安装chromedriver时失败的问题
- html动画转换为桌面动态壁纸,动态桌面:把精彩的flash动画设为桌面
- 基于 Redis 实现 CAS 操作
- hdu 3999The order of a Tree
- 数据科学家为什要用Git?怎么用?
- 简述HTML语言概念,HTML语言的基本概念和基本格式.doc
- [kuangbin带你飞]专题五 并查集 A - Wireless Network
- 【论文笔记】命名实体识别论文
- lpsolve java_如何使用LpSolve在R中设置线性编程优化?
- Java比较两个实体属性值是否相同,将不同的属性输出
- unity挺好用的移动端相机控制器(Android和IPhone通用)
- 苍井空是如何勾搭上社交电商的? - 案例 - i黑马网
- 手机软件测试sim卡流程,传统SIM卡:该说再见了
- ubuntu下查看硬件配置
热门文章
- 于的繁体字有几种写法_于字的意思、于的繁体字、于的笔顺笔画、于字部首和繁体字于的意思...
- 根证书,解决win7 sp1 64位系统在线安装VS2017 或VS2019的失败
- 【NCRE】初遇 SQL SERVER 的 CASE WHEN
- 当AI走进工厂,“小轴承”也可以转动“大产业”
- [Python深度学习入门]实战一·Numpy梯度下降求最小值
- 使用PC端谷歌Chrome浏览器浏览手机网页 修改PC端谷歌Chrome浏览器UA
- 【逻辑与计算理论】λ演算、组合子逻辑的历史背景
- VMware 12虚拟机win7中添加摄像头
- 中科大科学岛计算机博士,2017年科学岛分院博士研究生招生拟录取名单公示
- Redis集群——去中心化模式