19分代码 (如下)
这个是因为运算符号只用了5种,但其实题目并没有告诉你运算符号有哪几个,所以这些运算符号更深的共同点是都是非叶子节点。
#include <bits/stdc++.h>
typedef long long ll ;
using namespace std ;
const int maxn = 3e1 + 10 ;
const int inf = 0x3f3f3f3f ;
int d[maxn] ;
struct node{
string s ;
int u , v ;
}l[maxn];
void dfs(int root , int h){
if((h != 0) && (l[root].s == "%" || l[root].s == "*" || l[root].s == "-" || l[root].s == "+" || l[root].s == "/"))
cout << "(" ;
if(l[root].v != -1 && l[root].u == -1) {
cout << l[root].s ;
dfs(l[root].v , h+1) ;
}else{
if(l[root].u != -1)
dfs(l[root].u , h+1) ;
cout << l[root].s ;
if(l[root].v != -1)
dfs(l[root].v , h+1) ;
}
if((h != 0) && (l[root].s == "%" || l[root].s == "*" || l[root].s == "-" || l[root].s == "+" || l[root].s == "/"))
cout << ")" ;
}
void deal(){
int n ; cin >> n ;
for(int i = 1 ; i <= n ; i++){
cin >> l[i].s >> l[i].u >> l[i].v ;
d[l[i].u]++ ;
d[l[i].v]++ ;
}
int root = -1 ;
for(int i = 1 ; i <= n ; i++){
if(d[i] == 0) root = i ;
}
dfs(root , 0) ;
}
int main(){
deal() ;
return 0 ;
}
AC代码
#include <bits/stdc++.h>
typedef long long ll ;
using namespace std ;
const int maxn = 3e1 + 10 ;
const int inf = 0x3f3f3f3f ;
int d[maxn] ;
struct node{
string s ;
int u , v ;
}l[maxn];
void dfs(int root , int h){
if((h != 0) && !(l[root].v == -1 && l[root].u == -1))
cout << "(" ;
if(l[root].v != -1 && l[root].u == -1) {
cout << l[root].s ;
dfs(l[root].v , h+1) ;
}else{
if(l[root].u != -1)
dfs(l[root].u , h+1) ;
cout << l[root].s ;
if(l[root].v != -1)
dfs(l[root].v , h+1) ;
}
if((h != 0) && !(l[root].v == -1 && l[root].u == -1))
cout << ")" ;
}
void deal(){
int n ; cin >> n ;
for(int i = 1 ; i <= n ; i++){
cin >> l[i].s >> l[i].u >> l[i].v ;
d[l[i].u]++ ;
d[l[i].v]++ ;
}
int root = -1 ;
for(int i = 1 ; i <= n ; i++){
if(d[i] == 0) root = i ;
}
dfs(root , 0) ;
}
int main(){
deal() ;
return 0 ;
}