PAT-A1130. 二叉樹-中序遍歷 變形輸出

題目鏈接:https://www.patest.cn/contests/pat-a-practise/1130

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))

首先,數據輸出的方式是中序遍歷結果,然後考慮括號的位置。以圖中的根結點爲例,它的左右子樹分別需要一對括號,而兩個葉子結點之間是沒有括號的,因爲它們兩個之間只有父結點的運算符,所以得出結論:如果一個結點,它的子結點還有子結點(也就是它的子結點不是葉子結點),那麼這個子結點形成的子樹需要用括號括起來。

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

struct BTree{
    string data;
    int lchild, rchild;
};
BTree T[25];
bool bt[25];

void InOrder(int root)
{
    if(root == -1)
        return;
    else {
        if(T[root].lchild != -1 && (T[T[root].lchild].lchild != -1 || T[T[root].lchild].rchild != -1)){
            cout << "(";
            InOrder(T[root].lchild);
            cout << ")";
        }
        else
            InOrder(T[root].lchild);

        cout << T[root].data;

        if(T[root].rchild != -1 && (T[T[root].rchild].lchild != -1 || T[T[root].rchild].rchild != -1)){
            cout << "(";
            InOrder(T[root].rchild);
            cout << ")";
        }
        else
            InOrder(T[root].rchild);
    }
}

int main()
{
    int n,root;
    cin >> n;
    memset(bt, 0, sizeof(bt));
    for(int i = 1; i <= n; ++i){
        cin >> T[i].data >> T[i].lchild >> T[i].rchild;
        if(T[i].lchild != -1)
            bt[T[i].lchild] = true;
        if(T[i].rchild != -1)
            bt[T[i].rchild] = true;
    }
    for(int i = 1; i <= n; ++i){
        if(!bt[i]){
            root = i;
            break;
        }
    }

    InOrder(root);

    return 0;
}
發佈了23 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章