Given a syntax tree (binary), you are supposed to output the corresponding infix expression, with parentheses reflecting the precedences of the operators.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤ 20) which is the total number of nodes in the syntax tree. Then N lines follow, each gives the information of a node (the i-th line corresponds to the i-th node) in the format:

data left_child right_child

where data is a string of no more than 10 characters, left_child and right_child are the indices of this node's left and right children, respectively. The nodes are indexed from 1 to N. The NULL link is represented by −. The figures 1 and 2 correspond to the samples 1 and 2, respectively.

Figure 1 Figure 2

Output Specification:

For each case, print in a line the infix expression, with parentheses reflecting the precedences of the operators. Note that there must be no extra parentheses for the final expression, as is shown by the samples. There must be no space between any symbols.

Sample Input 1:

8
* 8 7
a -1 -1
* 4 1
+ 2 5
b -1 -1
d -1 -1
- -1 6
c -1 -1

Sample Output 1:

(a+b)*(c*(-d))

Sample Input 2:

8
2.35 -1 -1
* 6 1
- -1 4
% 7 8
+ 2 3
a -1 -1
str -1 -1
871 -1 -1

Sample Output 2:

(a*2.35)+(-(str%871))
题⽬⼤意:给⼀个⼆叉树,输出中缀表达式,且加上括号表示运算的优先级~
分析:⾸先根据所有孩⼦结点编号寻找1~n中没有出现过的编号标记为root,即树的根结点~然后进
⾏从root结点开始dfs~
dfs递归拼接 “(” + 左⼦树 + 根 + 右⼦树 + “)” 递归有四种情况(有效的只有三种):
1. 左右⼦树都空 返回 “(” + 根 + “)”
2. 左空右不空 返回 “(” + 根 + 右⼦树 + “)”
3. 左不空右空 这种情况不存在
4. 左右都不空 返回 “(” + 左⼦树 + 根 + 右⼦树 + “)” 最后递归返回的ans,最外层可能会被括号包起
来,也可能不被包起来。要判断⼀下,如果被包起来,把最外层括号去掉即可~

 #include <iostream>
#include <vector>
#include <string>
using namespace std;
struct node
{
string str;
int l, r;
}node[];
int n;
string dfs(int root)
{
if (node[root].l == - && node[root].r == -)
return node[root].str;
if (node[root].l == - && node[root].r != -)
return "(" + node[root].str + dfs(node[root].r)+")";
if (node[root].l != - && node[root].r != -)
return "(" + dfs(node[root].l) + node[root].str + dfs(node[root].r) + ")";
}
int main()
{
cin >> n;
int isroot[] = { }, root = ;
for (int i = ; i <= n; ++i)
{
cin >> node[i].str >> node[i].l >> node[i].r;
isroot[node[i].l == - ? : node[i].l] = ;
isroot[node[i].r == - ? : node[i].r] = ;
}
while (isroot[root] == )root++;//找出根节点,即根节点不是任何节点的孩子节点
string res = dfs(root);
if (res[] == '(')res = res.substr(, res.length() - );//去除最外面的一层括号
cout << res << endl;
return ;
}

PAT甲级——A1130 Infix Expression【25】的更多相关文章

  1. PAT甲级 1130. Infix Expression (25)

    1130. Infix Expression (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Give ...

  2. PAT甲级——1130 Infix Expression (25 分)

    1130 Infix Expression (25 分)(找规律.中序遍历) 我是先在CSDN上面发表的这篇文章https://blog.csdn.net/weixin_44385565/articl ...

  3. PAT 甲级 1130 Infix Expression

    https://pintia.cn/problem-sets/994805342720868352/problems/994805347921805312 Given a syntax tree (b ...

  4. PAT A1130 Infix Expression (25 分)——中序遍历

    Given a syntax tree (binary), you are supposed to output the corresponding infix expression, with pa ...

  5. A1130. Infix Expression

    Given a syntax tree (binary), you are supposed to output the corresponding infix expression, with pa ...

  6. 1130. Infix Expression (25)

    Given a syntax tree (binary), you are supposed to output the corresponding infix expression, with pa ...

  7. 【PAT甲级】1070 Mooncake (25 分)(贪心水中水)

    题意: 输入两个正整数N和M(存疑M是否为整数,N<=1000,M<=500)表示月饼的种数和市场对于月饼的最大需求,接着输入N个正整数表示某种月饼的库存,再输入N个正数表示某种月饼库存全 ...

  8. PAT甲题题解-1130. Infix Expression (25)-中序遍历

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789828.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  9. PAT甲级 1122. Hamiltonian Cycle (25)

    1122. Hamiltonian Cycle (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The ...

随机推荐

  1. 12. Jmeter-断言

    jmeter-断言介绍与使用 性能测试中较少用到断言.断言会增加脚本执行时间,但是接口测试中断言是必备的.什么是断言?其实就是功能测试中常说的预期结果和实际结果是否相等. 响应断言 JSON Asse ...

  2. 《单词的减法》state1~state17(第一遍学习记录)

    单词的减法 2016.05.18 state 1 accordingly 因此,相应地,对应地 advisory 顾问的,劝告的 annoy 打扰,干扰,使恼怒 anticipate/particip ...

  3. 【awk】 处理多个文件

    处理多个文件: 1. 可以在代码中指定读取某个文件, 其他的用命令行输入           while ( geline < "file.txt" > 0 ) {   ...

  4. js中浅谈this对象(未补充完整)

    什么是this? 1.javascript语言中,一切皆为对象(除了 undefined 和 null 之外),运行环境也是对象,所以函数都是在某个对象之中运行,this就是这个对象(环境). 2.t ...

  5. python 装饰器 第八步:使用类来作为装饰器参数

    #第八步:使用类作为装饰器参数 #装饰器使用的操作类 class Wish: #祈求方法 def before(): print('饭前洗洗手') #还愿方法 def after(): print(' ...

  6. java多线程学习笔记(七)

    volatile关键字 关键字volatile的主要作用是使变量在多个线程间可见. public class PrintString { private boolean isContinue = tr ...

  7. mysql 用户及权限管理 允许远程连接

    mysq,功能强大的关系型数据库,它的用户管理在开发过程中当然也尤其重要,接下来就看看mysql的用户管理 1.登录数据库 mysql -uroot -p 回车 输入密码... 回车 2.登录成功后, ...

  8. spring cloud 使用Eureka作为服务注册中心

    什么是Eureka?  Eureka是在AWS上定位服务的REST服务. Eureka简单示例,仅作为学习参考 在pom文件引入相关的starter(起步依赖) /*定义使用的spring cloud ...

  9. 在controller的action内, 得到用户发过来的请求地址和参数url

    class PController extends Controller{ public function Log() { echo $_SERVER["HTTP_HOST"] . ...

  10. MQ之Kafka

    现代的互联网分布式系统,只要稍微大一些,就一定逃不开3类中间件:远程调用(RPC)框架.消息队列.数据库访问中间件.Kafka 是消息队列中间件的代表产品,用 Scala 语言实现; 基本概念 首先, ...