博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PAT甲级——A1130 Infix Expression【25】
阅读量:4541 次
发布时间:2019-06-08

本文共 2717 字,大约阅读时间需要 9 分钟。

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.

infix1.JPG infix2.JPG
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 7a -1 -1* 4 1+ 2 5b -1 -1d -1 -1- -1 6c -1 -1

Sample Output 1:

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

Sample Input 2:

82.35 -1 -1* 6 1- -1 4% 7 8+ 2 3a -1 -1str -1 -1871 -1 -1

Sample Output 2:

(a*2.35)+(-(str%871))
题⽬⼤意:给⼀个⼆叉树,输出中缀表达式,且加上括号表示运算的优先级~
分析:⾸先根据所有孩⼦结点编号寻找1~n中没有出现过的编号标记为root,即树的根结点~然后进
⾏从root结点开始dfs~
dfs递归拼接 “(” + 左⼦树 + 根 + 右⼦树 + “)” 递归有四种情况(有效的只有三种):
1. 左右⼦树都空 返回 “(” + 根 + “)”
2. 左空右不空 返回 “(” + 根 + 右⼦树 + “)”
3. 左不空右空 这种情况不存在
4. 左右都不空 返回 “(” + 左⼦树 + 根 + 右⼦树 + “)” 最后递归返回的ans,最外层可能会被括号包起
来,也可能不被包起来。要判断⼀下,如果被包起来,把最外层括号去掉即可~
 
1 #include 
2 #include
3 #include
4 using namespace std; 5 struct node 6 { 7 string str; 8 int l, r; 9 }node[50];10 int n;11 string dfs(int root)12 {13 if (node[root].l == -1 && node[root].r == -1)14 return node[root].str;15 if (node[root].l == -1 && node[root].r != -1)16 return "(" + node[root].str + dfs(node[root].r)+")";17 if (node[root].l != -1 && node[root].r != -1)18 return "(" + dfs(node[root].l) + node[root].str + dfs(node[root].r) + ")";19 }20 int main()21 {22 cin >> n;23 int isroot[50] = { 0 }, root = 1;24 for (int i = 1; i <= n; ++i)25 {26 cin >> node[i].str >> node[i].l >> node[i].r;27 isroot[node[i].l == -1 ? 0 : node[i].l] = 1;28 isroot[node[i].r == -1 ? 0 : node[i].r] = 1;29 }30 while (isroot[root] == 1)root++;//找出根节点,即根节点不是任何节点的孩子节点31 string res = dfs(root);32 if (res[0] == '(')res = res.substr(1, res.length() - 2);//去除最外面的一层括号33 cout << res << endl;34 return 0;35 }

 

转载于:https://www.cnblogs.com/zzw1024/p/11483625.html

你可能感兴趣的文章
项目重构
查看>>
(笔试题)和一半的组合数
查看>>
leetcode--Algorithm--Array_Part 1 Easy- 566 Reshape the Matrix
查看>>
AC自动机算法详解 (转载)
查看>>
python3-day5(模块)
查看>>
Linux配置JDK
查看>>
qt 读取xml文件
查看>>
python3之正则表达式
查看>>
Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
查看>>
Java 时间总结
查看>>
jQuery EasyUI 拖放 – 基本的拖动和放置
查看>>
这些年正Android - 母亲
查看>>
[工具] BurpSuite--XssValidator插件
查看>>
LPC1788系统时钟初始化
查看>>
channel vs mutex
查看>>
页面布局(--FlowLayout,--BorderLayout,--GridLayout)
查看>>
实验吧--web--你真的会php吗
查看>>
python中的setdefault()方法
查看>>
转 VSFTP用户权限管控
查看>>
poj2420 A Star not a Tree? 模拟退火
查看>>