import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类 the root of binary tree
* @return int整型二维数组
*/
public int[][] threeOrders (TreeNode root) {
// write code here
if(root == null) return new int[0][0];
List<List<Integer>> l = new ArrayList<>();
Stack<TreeNode> s = new Stack<>();
List<Integer> preArr = new ArrayList<Integer>();
s.push(root);
while(!s.isEmpty()){
TreeNode temp = s.pop();
preArr.add(temp.val);
if(temp.right != null) s.push(temp.right);
if(temp.left != null) s.push(temp.left);
}
l.add(preArr);
List<Integer> inArr = new ArrayList<Integer>();
TreeNode tem = root;
while(!s.isEmpty() || tem != null){
if(tem != null) {
s.push(tem);
tem = tem.left;
}
else {
tem = s.pop();
inArr.add(tem.val);
tem = tem.right;
}
}
l.add(inArr);
Stack<TreeNode> assistant = new Stack<>();
s.push(root);
while(!s.isEmpty()){
TreeNode temp = s.pop();
assistant.push(temp);
if(temp.left != null) s.push(temp.left);
if(temp.right != null) s.push(temp.right);
}
List<Integer> posArr = new ArrayList<Integer>();
while(!assistant.isEmpty()){
posArr.add(assistant.pop().val);
}
l.add(posArr);
int len = posArr.size();
int[][] res = new int[l.size()][len];
for(int i = 0; i < l.size(); i++){
for(int j = 0; j < len; j++){
res[i][j] = l.get(i).get(j);
}
}
return res;
}
}