直接 模拟,然后,每次找到编号最小的一个点的父亲输出就可以了。
注意格式,输入输出就OK 了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
#define maxn 10000
using namespace std;
char s[maxn];
vector<int> g[51];
int n;
void init()
{
for(int i=0;i<=50;i++)
g[i].clear();
}
void build(int v,int l,int r)
{
char c;
int u=0;
int tr=0;
l++;r--;
int li,ri;
while(l<=r)
{
if(s[l]>='0'&&s[l]<='9')
{
u=u*10+s[l]-'0';
}
else if(s[l]=='(')
{
break;
}
l++;
}
if(u>n)n=u;
if(v!=-1)
{
g[u].push_back(v);
g[v].push_back(u);
}
tr=0;
for(int i=l;i<=r;i++)
{
if(s[i]=='(')
{
if(tr==0)li=i;
tr++;
}
else if(s[i]==')')
{
tr--;
if(tr==0)
{
build(u,li,i);
}
}
}
}
bool vis[102];
void op(int num)
{
int fa=g[num][0];
g[fa].erase(find(g[fa].begin(),g[fa].end(),num));
vis[num]=1;
printf("%d",fa);
}
void solve()
{
int len=strlen(s);
n=0;
build(-1,0,len-2);
memset(vis,0,sizeof(vis));
bool single_node=true;
for(int i=1;i<n;i++)
{
single_node=false;
int temp=10000;
for(int j=1;j<=n;j++)
{
if(!vis[j])
{
if(g[j].size()==1&&j<temp)
{
temp=j;
}
}
}
op(temp);
if(i==n-1)printf("\n");
else printf(" ");
}
if(single_node)printf("\n");
}
int main()
{
while(fgets(s,maxn,stdin))
{
init();
solve();
}
return 0;
}