pat 1130

1130 Infix Expression (25分)  

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.

pat 1130 pat 1130
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. 左右子树都空 返回 “(” + 根 + “)”
2. 左空右不空 返回 “(” + 根 + 右子树 + “)”
3. 左不空右空 这种情况不存在
4. 左右都不空 返回 “(” + 左子树 + 根 + 右子树 + “)”
最后递归返回的ans,最外层可能会被括号包起来,也可能不被包起来。要判断一下,如果被包起来,把最外层括号去掉即可
代码如下:
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
struct node{
    int parent;
    int left;
    int right;
    string value;
}node[25];
int realRoot;
int findRoot(int a){
    while(node[a].parent!=-1)
        a=node[a].parent;
    return a;
}
string inOrder(int root){
    if(node[root].left==-1&&node[root].right==-1){
        return node[root].value;
    }
    else if(node[root].left==-1&&node[root].right!=-1){
        return "("+node[root].value+inOrder(node[root].right)+")"; 
    }
    else if(node[root].left!=-1&&node[root].right==-1){
        return "("+inOrder(node[root].left)+node[root].value+")";
    }
    else
        return "("+inOrder(node[root].left)+node[root].value+inOrder(node[root].right)+")";
//    if(root!=-1){
//        if(node[root].left==-1&&node[node[root].parent].left==root)
//            printf("(");
//        inOrder(node[root].left);
//        if(node[root].value[0]=='-'&&node[root].left==-1){
//            printf("(");
//        }
//        printf("%s",node[root].value);
//
//        if(node[root].right==-1&&node[node[root].parent].right==root){
//            printf(")");
//            int temp=root;
//            while(temp!=realRoot){
//                if(node[node[temp].parent].value[0]=='-'&&node[node[temp].parent].left==-1)
//                    printf(")");
//                temp=node[temp].parent;
//            }
//            
//        }
//        
//        inOrder(node[root].right); 
//    }
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<=n;i++){
        node[i].parent=-1;
    }
    for(int i=1;i<=n;i++){
        cin>>node[i].value;
        scanf("%d %d",&node[i].left,&node[i].right);
        if(node[i].left!=-1)
            node[node[i].left].parent=i;
        if(node[i].right!=-1)
            node[node[i].right].parent=i;
    }
    int root=findRoot(1);
//    realRoot=root;
    string ans=inOrder(root);

    if(ans[0]=='(')
        ans=ans.substr(1,ans.size()-2);
    cout<<ans;
    return 0;
} 

 

注释部分为另一种方法,测试点3 4 未通过,笔者只考虑了 “-” 作为单目运算符时候的情况,并做出了处理,0-2三个测试点可以通过。欢迎大家评论区留言注释起来的方法

 

上一篇:1130 Infix Expression(PAT)


下一篇:mysql的error记录