• 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.

    infix1.JPGinfix2.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 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三个测试点可以通过。欢迎大家评论区留言注释起来的方法

  • 相关阅读:
    一本通课后练习 / 高手训练
    毒瘤 dp 题做题记录
    埃及分数
    CF340E Iahub and Permutations
    NOI2020 SDOI 爆零记
    Codeforces *1400-1600 做题记录
    Codeforces Round #636 (Div 3) 题解
    Codeforces Round #634 (Div 3) 题解
    洛谷 P4231 三步必杀
    【洛谷】【线段树+位运算】P2574 XOR的艺术
  • 原文地址:https://www.cnblogs.com/foodie-nils/p/13263375.html
Copyright © 2020-2023  润新知