zoukankan      html  css  js  c++  java
  • PAT甲级——1130 Infix Expression (25 分)

    1130 Infix Expression (25 分)(找规律、中序遍历)

    我是先在CSDN上面发表的这篇文章https://blog.csdn.net/weixin_44385565/article/details/89035813

    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 1. The figures 1 and 2 correspond to the samples 1 and 2, respectively.

    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 #include<iostream>
     2 #include<vector>
     3 #include<string>
     4 using namespace std;
     5 struct node {
     6     string data;
     7     int left, right;
     8 };
     9 int root;
    10 void inorder(vector<node> &v, int index);
    11 int main()
    12 {
    13     int N;
    14     scanf("%d", &N);
    15     vector<node> v(N + 1);
    16     vector<int> flag(N + 1, 0);
    17     for (int i = 1; i <= N; i++) {
    18         string tmp;
    19         int left, right;
    20         cin >> tmp;
    21         scanf("%d%d", &left, &right);
    22         v[i] = { tmp,left,right };
    23         if (left != -1) flag[left] = 1;
    24         if (right != -1) flag[right] = 1;
    25     }
    26     for (int i = 1; i <= N; i++)//寻找根节点 
    27         if (flag[i] != 1) {
    28             root = i;
    29             break;
    30         }
    31     inorder(v, root);
    32     return 0;
    33 }
    34 void inorder(vector<node> &v, int index)
    35 {
    36     if (index != -1) {
    37         if (index != root && (v[index].left != -1 || v[index].right != -1))
    38             printf("(");
    39         inorder(v, v[index].left);
    40         cout<<v[index].data;
    41         inorder(v, v[index].right);
    42         if (index != root && (v[index].left != -1 || v[index].right != -1))
    43             printf(")");
    44     }
    45 }
  • 相关阅读:
    织梦分页条添加省略号(支持动态静态)
    织梦点击数或者其他数值过【千】过【万】过【亿】的写法
    织梦文章页每个TAG标签单独输出相关文章
    织梦验证码不显示解决方法总结
    织梦搜索结果根据搜索不同栏目显示不同搜索结果模板
    织梦正则提取中英混合字符串中第一个中文汉字
    织梦让内容摘要多行文本支持换行
    织梦dede:tag标签输入添加自增autoindex
    织梦去除底部版权power by dedecms
    织梦自定义表单添加访客提交时间和访客IP+限制每天每个IP提交表单次数
  • 原文地址:https://www.cnblogs.com/yinhao-ing/p/10657226.html
Copyright © 2011-2022 走看看