zoukankan      html  css  js  c++  java
  • 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三个测试点可以通过。欢迎大家评论区留言注释起来的方法

  • 相关阅读:
    面向使用的软件设计随笔04
    面向使用的软件设计随笔03
    面向使用的软件设计随笔02
    面向使用的软件设计随笔01
    阅读笔记16
    阅读笔记15
    阅读笔记14
    阅读笔记13
    如何在Mac OS X上安装 Ruby运行环境
    IOS开发隐藏键盘的4种方法
  • 原文地址:https://www.cnblogs.com/foodie-nils/p/13263375.html
Copyright © 2011-2022 走看看