1130. Infix Expression (25)

1130. Infix Expression (25)

時間限制
400 ms
內存限制
65536 kB
代碼長度限制
16000 B
判題程序
Standard
作者
CHEN, Yue

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.

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))
題意:給出二叉樹,按中序遍歷輸出(帶括號)

思路:因爲輸入的結構就是二叉樹了,所以不需要自己再寫一個(只要模擬就好了)

           關鍵點在於,要找出根節點 (沒有被左右子樹提到的就是根節點)

代碼:

#include<string>
#include<iostream>
using namespace std;
struct node {
	string data;
	int lchild;
	int rchild;
}num[30];
void infix(int root)
{
	if (root == -1) return;
	if (num[root].lchild > 0 || num[root].rchild > 0)	cout << "(";
	if (num[root].lchild > 0) infix(num[root].lchild);
	cout << num[root].data;
	if (num[root].rchild > 0) infix(num[root].rchild);
	if (num[root].lchild > 0 || num[root].rchild > 0)	cout << ")";
}
int main()
{
	int n,root;
	cin >> n;
	int check[30] = { 0 };
	for (int i = 1; i <= n; i++)
	{
		cin >> num[i].data >> num[i].lchild >> num[i].rchild;
		if (num[i].lchild > 0) check[num[i].lchild] = 1;
		if (num[i].rchild > 0) check[num[i].rchild] = 1;
	}
	for (root = 1; root <= n; root++)
		if (!check[root]) break;
	infix(num[root].lchild);
	cout << num[root].data;
	infix(num[root].rchild);
	cout << endl;
}

結尾: 這題做的比較順利,但是交上去的時候後面幾個測試點一直提示段錯誤

    仔細想了想,因爲我輸出是 左子樹 右子樹 分開的,而前面沒有加判斷>0 的 if,所以最後加了第11行 如果==-1 就 retur




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章