#P2567. Code the Tree
Code the Tree
中文题面:
描述
给定一棵用整数编号的树(即无环的连通图)。
这棵树的"Prufer"编码构建方式如下: 选择编号最小的叶子节点(只连接一条边的顶点),将该叶子节点及其连接的边从图中移除,并记录下与该叶子节点相邻的顶点的编号。在剩下的图中重复这个过程,直到只剩下一个顶点(根据定义,这个顶点总是编号为的顶点)。 记录下的个编号序列即为该树的Prufer编码。
你的任务是,给定一棵树,计算它的Prufer编码。树的表示方式遵循以下语法规则:
T ::= "(" N S ")"
S ::= " " T S
| empty
N ::= number
也就是说,树被括号包围,括号内是一个表示根顶点编号的数字,后面跟着任意数量(可能为零)的子树,子树之间用单个空格分隔。
例如,样例输入中的第一行表示的图可以参见下图。你可以使用问题2568的解决方案来生成更多的样例输入。
需要注意的是,根据上面的定义,树的根顶点也可能是一个叶子节点。 我们指定一个顶点作为根只是为了表示方便。通常情况下,我们处理的是"无根树"。
输入:
输入包含多个测试用例。每个测试用例在一行中按照上述语法规则描述了一棵树。
输入以文件结束符()结束。假设。
输出:
对于每个测试用例,输出一行包含该树对应的Prufer编码。
编码中的数字用单个空格分隔。行尾不要输出任何空格。
输入数据1
(2 (6 (7)) (3) (5 (1) (4)) (8))
(1 (2 (3)))
(6 (1 (4)) (2 (3) (5)))
输出数据1
5 2 5 2 6 2 8
2 3
2 1 6 2 6
来源
ACM国际大学生程序设计竞赛(ACM-ICPC) 德国乌尔姆大学分站赛