文章目录

  • 问题描述 :
  • 输入说明 :
  • 输出说明 :
  • 输入范例 :
  • 输出范例 :
  • 思路分析
  • 代码实现
  • 事故现场
    • 第一次提交
  • 分析与总结
  • 如果不妥请留言,你的关注和回复是对我最大的鼓励,谢谢!如果想立即回复,可以加扣扣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,一起商量学习进步!!

二叉树:表达式二叉树转换成中缀式(括弧处理)相关推荐

  1. 将表达式树转换成中缀表达式☆

    题目:请设计一个算法,将给定的表达式树,转换成等价的中缀表达式并输出. 分析:         题目已然说明我们要采取中序遍历,进而输出该表达式,那么需要注意的点便是我们的括号在哪里加,其中根节点处( ...

  2. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  3. 一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以'#'字符作为结束标志. Output 输出 ...

  4. c 语言表达式求值中缀变后缀,表达式求值关于中缀式转后缀式的问题!

    已结贴√ 问题点数:10 回复次数:6 表达式求值关于中缀式转后缀式的问题! 本人看资料的时候遇到一段代码,这段代码中转为后缀式的优先级那句不明白,请大神赐教,代码如下(c语言) #include # ...

  5. php 下划线转大写开头,使用PHP把下划线分隔命名的字符串 转换成驼峰式命名方式 , 把下划线后面的第一个字母变成大写...

    最近项目使用symfony框架,这个框架对数据库的操作在这个团队里使用的是ORM进行操作,说实话使用ORM的开发效率和运行效率不一定高多少,到是它的实体命名和现有数据库字段的命名不太一样,ORM实体属 ...

  6. 要求实现编译器的以下功能: (1) 按规则拼单词,并转换成二元式形式 (2) 删除注释行 (3) 删除空白符 (空格、回车符、制表符) (4) 列表打印源程序,按照源程序的行打印,在每行的前面加上行号

    目录 目录    2 1 实验目的··· 3 2 实验内容··· 3 2.1 TINY计算机语言描述··· 3 2.2 实验要求··· 3 3 此法分析器的程序实现··· 4 3.1 状态转换图··· ...

  7. 每天一道LeetCode-----将二叉树原地平铺成链式结构

    Flatten Binary Tree to Linked List 原题链接Flatten Binary Tree to Linked List 给定一个二叉树,将其原地平铺成链式结构(按先序遍历的 ...

  8. SDUT OJ 2132 (一般算术表达式转换成后缀式)

    题目描述 Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以'#'字符作为结束标志. Output 输出该表达式转换所得到的 ...

  9. 数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以'#'字符作为结束标志. Output 输出该表达式转换所得到的后缀式. ...

最新文章

  1. java代码 将字符串快速生成到string.xml中
  2. python curses_用 Python 进行 Curses 编程
  3. python 批量处理文件重命名
  4. pycharm 怎么查看函数信息?
  5. python数值运算符也叫内置运算符_Python全栈工程师(数值类型、运算符)
  6. 递归删除目录下.svn文件
  7. 解决@vue/cli 创建项目是安装chromedriver时失败的问题
  8. html动画转换为桌面动态壁纸,动态桌面:把精彩的flash动画设为桌面
  9. 基于 Redis 实现 CAS 操作
  10. hdu 3999The order of a Tree
  11. 数据科学家为什要用Git?怎么用?
  12. 简述HTML语言概念,HTML语言的基本概念和基本格式.doc
  13. [kuangbin带你飞]专题五 并查集 A - Wireless Network
  14. 【论文笔记】命名实体识别论文
  15. lpsolve java_如何使用LpSolve在R中设置线性编程优化?
  16. Java比较两个实体属性值是否相同,将不同的属性输出
  17. unity挺好用的移动端相机控制器(Android和IPhone通用)
  18. 苍井空是如何勾搭上社交电商的? - 案例 - i黑马网
  19. 手机软件测试sim卡流程,传统SIM卡:该说再见了
  20. ubuntu下查看硬件配置

热门文章

  1. 于的繁体字有几种写法_于字的意思、于的繁体字、于的笔顺笔画、于字部首和繁体字于的意思...
  2. 根证书,解决win7 sp1 64位系统在线安装VS2017 或VS2019的失败
  3. 【NCRE】初遇 SQL SERVER 的 CASE WHEN
  4. 当AI走进工厂,“小轴承”也可以转动“大产业”
  5. [Python深度学习入门]实战一·Numpy梯度下降求最小值
  6. 使用PC端谷歌Chrome浏览器浏览手机网页 修改PC端谷歌Chrome浏览器UA
  7. 【逻辑与计算理论】λ演算、组合子逻辑的历史背景
  8. VMware 12虚拟机win7中添加摄像头
  9. 中科大科学岛计算机博士,2017年科学岛分院博士研究生招生拟录取名单公示
  10. Redis集群——去中心化模式