#P2568. Decode the Tree
Decode the Tree
中文题面:
描述
给定一棵顶点用整数编号的树(即无环连通图)。该树的“普鲁弗码”构建方法如下:选取编号最小的叶子节点(即仅关联一条边的顶点),将该叶子节点及其关联的边从图中移除,同时记录与该叶子节点相邻的顶点编号。对剩余的图重复此过程,直至仅剩一个顶点(该顶点编号始终为)。所记录的个编号序列称为该树的普鲁弗码。
你的任务是根据给定的普鲁弗码重构一棵树,并按以下语法规则用字符串表示该树:
T ::= "(" N S ")"
S ::= " " T S | 空
N ::= 数字
也就是说,树的表示由一对括号包裹,括号内首部为表示根节点编号的数字,后跟任意数量(可能为零)的子树,子树之间用单个空格分隔。
例如,样例输出第一行表示的树结构如图所示。更多样例输入可通过问题2567的解法生成。
请注意,根据上述定义,树的根节点也可以是叶子节点。指定根节点仅是为了表示方便,通常我们处理的是“无根树”。
输入:
输入包含多个测试用例。每个测试用例占一行,包含个用空格分隔的整数,表示一棵树的普鲁弗码。
输入以结束。可假设。
输出:
对每个测试用例,输出一行对应的树结构,格式如上述描述。
注意,此类树可能存在多种合法表示方式,选择其中一种即可。
输入数据1
5 2 5 2 6 2 8
2 3
2 1 6 2 6
输出数据1
(8 (2 (3) (5 (1) (4)) (6 (7))))
(3 (2 (1)))
(6 (1 (4)) (2 (3) (5)))
来源
ACM国际大学生程序设计竞赛(ACM-ICPC) 德国乌尔姆大学分站赛