C1068 - LISP二叉树表示

题目描述

LISP(List Processor的缩写)是一种编程语言,最初是在1958年由约翰·麦卡锡在麻省理工学院设计的,主要用于人工智能和计算机研究。LISP语言的核心特点是它的列表处理能力,它使用一种名为S表达式(或符号表达式)的结构来表示数据和代码。这种表达方式让LISP在处理递归算法和符号计算方面非常有效。

在LISP中表示二叉树可以通过使用列表的列表来实现。每个节点可以表示为一个列表,其中第一个元素是节点的值,第二个元素是左子树,第三个元素是右子树。如果某个子树为空,通常用特殊值如nil表示。这样的表示法非常符合LISP处理列表的自然方式。

例如,一个简单的二叉树(如图示),其中根节点为1,左子节点为2,右子节点为3,可以在LISP中表示如下:

1.png

(1 (2 nil nil) (3 nil nil))

这里,1是根节点,(2 nil nil)是左子树,表示有一个值为2的节点,没有左右子节点;(3 nil nil)是右子树,同样表示有一个值为3的节点,没有左右子节点。

现在,输入一个LISP格式的二叉树字符串,请你根据这个字符串构造出该二叉树,并对它进行中序遍历和层次遍历

本题中给出的LISP格式的二叉树字符串跟上面的有点不一样:

表示上图中的二叉树,给定的LISP字符串是:

(1 (2 () ()) (3 () ()))

使用()去表示一个空节点

比如LISP字符串:

(5 (4 (11 (7 () ()) (2 () ()) ) ()) (8 (13 () ()) (4 () (1 () ()) ) ) )

还原成的二叉树是:

2.png

输入格式

输入1行LISP格式的二叉树字符串,该字符串中可以包含多个空格,数字与括号之间、括号和括号之间都可以包含多个空格的

每个二叉树的节点都是一个合法的int整数,可以是正数也可以是负数或者是0,比如

(-13 (-2 () ()) (0 () ()))

这样的输入

同时不会存在输入纯空二叉树LISP字符串的情况

输出格式

第1行,该二叉树的中序遍历结果字符串,每个节点数据使用一个空格分隔

第2行,该二叉树的层次遍历结果字符串,每个节点数据使用一个空格分隔

输入输出样例

输入样例 输出样例
(1 (2 () ()) (3 () ())) 2 1 3
1 2 3
(-13 (-2 () ()) (0 () ())) -2 -13 0
-13 -2 0
(5 ( 4 (11 (7 () ()) (2 () ()) ) ()) (8 (13 () ()) (4 () (1 () ()) ) ) ) 7 11 2 4 5 13 8 4 1
5 4 8 11 13 4 7 2 1

数据范围与提示

100%的数据:3 <= LISP格式二叉树字符串长度 <= 100,不会存在纯空二叉树的情况

测试点数目

共10个测试点,每个测试点10分

时间与内存限制

每个测试点时间:1000ms(1.0s),内存:256MiB

输入输出模式

本OJ支持两种输入输出模式

1. 标准输入输出模式:
直接从标准输入和标准输出读写数据,不需要使用freopen进行文件输入输出重定向
2. 文件输入输出模式(国内信奥赛输入输出模式):
从文件中读写数据,需要使用freopen进行输入输出重定向
本题输入文件名为:C1068.in,输出文件名为:C1068.out