树的括号表示法
TimeLimit:1000MS MemoryLimit:128MB
64-bit integer IO format:%lld
已解决 | 点击收藏
×
收藏题目
备注
Close确定
Problem Description
HOME_W发明了一种括号表示法来表示二叉树结构
他的递归定义如下,
-
若结点v有左孩子或者右孩子,且左右子树的括号表示分别为A,B。则结点v的括号表示法为 v(A,B)
-
否则 空树用#表示,只有一个结点v的树的括号表示法就是 v
例如树
1
/ \
2 3
/
4
的括号表示法是
1(2(4,#),3)
这种表示法有些优越之处,既保留了二叉树的先序遍历顺序,又存贮了树的结构。方便了树结构在网络上的传输,且解析时甚至不需要重新建立这颗树
现在给你一颗以1为根的二叉树的所有边,请输出这棵树的括号表示法
Input
单组数据
第一行是一个整数n,代表树的结点数。
接下来有n-1行,每行有两个整数a,b代表的a,b之间有一条边。
n<=1e5
1<=a,b<=n
保证输入是一颗合法的二叉树
Output
请输出一行,代表这棵树的括号表示法,由于输出结果可能不唯一,请输出字典序最小的方案
题意修正:这里的字典序是只比较整个数字和#号的
其中大小关系如下:#<1<2<3<……<10<11<……<100<101<……
SampleInput
2 1 2
SampleOutput
1(#,2)
题解:DFS
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<bitset>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define eps (1e-8)
#define MAX 0x3f3f3f3f
#define u_max 1844674407370955161
#define l_max 9223372036854775807
#define i_max 2147483647
#define re register
#define pushup() tree[rt]=tree[rt<<1]+tree[rt<<1|1]
using namespace std;
inline int read(){
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' & c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
typedef long long ll;
const double pi = atan(1.)*4.;
const int M=4e5+5;
const int N=2e6+5;
vector<int>v[M];
int vv[M];
int f[N],p=0;
void dfs(int x){
f[p++]=x;
if(x!=0)
vv[x]=1;
f[p++]=N; // N 代表左括号
for(int i=0;i<v[x].size();i++){
if(vv[v[x][i]]) continue;
dfs(v[x][i]);
}
f[p++]=N+1; // N+1 代表右括号
}
int main(){
int n,a,b;
scanf("%d",&n);
if(n==1){
printf("1\n");
return 0;
}
int m=n-1;
for(int i=0;i<m;i++){ // 建图
scanf("%d %d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
// 先弄成满二叉树
if(v[1].size()==1) v[1].push_back(0); // 0 代表空值
for(int i=2;i<=n;i++){
if(v[i].size()==1||v[i].size()==0) continue;
if(v[i].size()==2) v[i].push_back(0);
}
for(int i=1;i<=n;i++) sort(v[i].begin(),v[i].end());
dfs(1);
int i=0;
while(i<p){
if(f[i]>0&&f[i]<N){
printf("%d",f[i]);
i++;
}
else if(f[i]==0){
printf("#");
i++;
}
else if(f[i]==N&&f[i+1]==N+1){
if(f[i+2]!=N+1)
printf(",");
i=i+2;
}
else if(f[i]==N&&f[i+1]!=N+1){
printf("(");
i++;
}
else if(f[i]==N+1){
if(i!=p-1){
if(f[i+1]!=N+1)
printf("),");
else
printf(")");
}
else{
printf(")");
}
i++;
}
}
return 0;
}