请用非递归方式实现二叉树的先序、中序和后序的遍历打印。 给定一个二叉树的根结点root,请依次返回二叉树的先序,中序和后续遍历(二维数组的形式)。
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}*/
public class TreeToSequence {
public int[][] convert(TreeNode root) {
// write code here
List<Integer> pre = new ArrayList<Integer>();
List<Integer> in = new ArrayList<Integer>();
List<Integer> post = new ArrayList<Integer>();
preOrder(root, pre);
inOrder(root, in);
postOrder(root, post);
int[][] res = new int[3][pre.size()];
for(int i = 0; i < pre.size(); i++){
res[0][i] = pre.get(i);
res[1][i] = in.get(i);
res[2][i] = post.get(i);
}
return res;
}
public void preOrder(TreeNode root, List<Integer> list){
if(root == null)
return;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode cur = stack.pop();
list.add(cur.val);
if(cur.right != null)
stack.push(cur.right);
if(cur.left != null)
stack.push(cur.left);
}
}
public void inOrder(TreeNode root, List<Integer> list){
if(root == null)
return;
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(!stack.isEmpty() || cur != null){
if(cur != null){
stack.push(cur);
cur = cur.left;
}else{
cur = stack.pop();
list.add(cur.val);
cur = cur.right;
}
}
}
public void postOrder(TreeNode root, List<Integer> list){
if(root == null)
return;
Stack<TreeNode> stack = new Stack<>();
TreeNode h = root, c = null;
stack.push(root);
while(!stack.isEmpty()){
c = stack.peek();
if(c.left != null && (c.left != h && c.right != h)){
stack.push(c.left);
c = c.left;
}else if(c.right != null && c.right != h){
stack.push(c.right);
c = c.right;
}else{
h = c;
TreeNode tmp = stack.pop();
list.add(tmp.val);
}
}
}
}