import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @描述:遍历二叉树
* @思路:
* @复杂度:
* @链接: https://www.nowcoder.com/practice/566f7f9d68c24691aa5abd8abefa798c
*/
class TraversalBinaryTree {
public static void preOrderTraversal(TreeNode root) {
if(root==null) {
return;
}
System.out.print(root.value + " ");
if (root.left != null) {
preOrderTraversal(root.left);
}
if (root.right != null) {
preOrderTraversal(root.right);
}
}
public static void inOrderTraversal(TreeNode root) {
if (root.left != null) {
inOrderTraversal(root.left);
}
System.out.print(root.value + " ");
if (root.right != null) {
inOrderTraversal(root.right);
}
}
public static void postOrderTraversal(TreeNode root) {
if(root==null) {
return;
}
if (root.left != null) {
postOrderTraversal(root.left);
}
if (root.right != null) {
postOrderTraversal(root.right);
}
System.out.print(root.value + " ");
}
}
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String[] firstRow = in.readLine().split(" ");
int row = Integer.parseInt(firstRow[0]);
String[] nodeValueArr = new String[row * 3];
TreeNode root = TreeUtils.makeBinaryTreeByInput(in);
// System.out.println("先序遍历:");
TraversalBinaryTree.preOrderTraversal(root);
// System.out.println("\n" + "中序遍历:");
System.out.println();
TraversalBinaryTree.inOrderTraversal(root);
// System.out.println("\n" + "后序遍历:");
System.out.println();
TraversalBinaryTree.postOrderTraversal(root);
}
}
class TreeUtils {
private static TreeNode root;
/**
* 采用递归的方式创建一颗二叉树
* n 行每行三个整数 fa,lch,rch,
* 表示 fa 的左儿子为 lch,右儿子为 rch。(如果 lch 为 0 则表示 fa 没有左儿子,rch同理)
* 构造后是二叉树的二叉链表表示法
*/
//创建一个树的结点
public static TreeNode<String> makeBinaryTreeByInput(BufferedReader in) throws Exception{
String[] nodeVals = in.readLine().split(" ");
//数组中第一个数是根节点
TreeNode<String> node = new TreeNode<>(nodeVals[0]);
//通过递归确定了层数
if (!"0".equals(nodeVals[1])) {
node.left = makeBinaryTreeByInput(in);
}
if (!"0".equals(nodeVals[2])) {
node.right = makeBinaryTreeByInput(in);
}
return node;
}
}
class TreeNode<T> {
public T value;
public TreeNode<T> left;
public TreeNode<T> right;
public TreeNode(T value) {
this.value = value;
}
public TreeNode( ) {
}
public TreeNode(TreeNode left, T value, TreeNode right) {
this.value = value;
this.left = left;
this.right = right;
}
}