其他分享
首页 > 其他分享> > 合法括号序列和树形结构的互相转化

合法括号序列和树形结构的互相转化

作者:互联网

一、算法简述

将一棵节点数量为 $n$ 的树转化为一个长度为 $2n$ 的合法括号序列:

char bracket[];
int cnt;
void dfs(int x) {
    bracket[++cnt] = '(';
    for(int i : son(x)) dfs(i);
    bracket[++cnt] = ')';
}

生成方式:从根节点 dfs 整棵树,从父节点 dfs 到该节点时,给括号序列插入一个 (;从子节点回溯到该节点时,给括号序列插入一个 )
从括号序列逆推树结构的算法:

int now = 0, cnt, fa[];
for(char s : bracket){
    if(s == '(') {
        ++cnt;
        son(now).push(cnt);
        fa[cnt] = now;
    }
    else now = fa[now];
}

二、性质

根据题目条件灵活运用。

  1. 一条链对应到括号序列上就是 ((((((())))))) 这样的括号序列。

标签:互相转化,cnt,int,括号,树形,序列,now,节点
来源: https://www.cnblogs.com/Zeardoe/p/16213505.html