合法括号序列和树形结构的互相转化
作者:互联网
一、算法简述
将一棵节点数量为 $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];
}
二、性质
根据题目条件灵活运用。
- 一条链对应到括号序列上就是
((((((()))))))
这样的括号序列。
标签:互相转化,cnt,int,括号,树形,序列,now,节点 来源: https://www.cnblogs.com/Zeardoe/p/16213505.html