(dfs)-树的括号表示法

树的括号表示法

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)

Submit

题解: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;
}

猜你喜欢

转载自blog.csdn.net/black_horse2018/article/details/83042241