请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
/*
这个编程题的思路还是按照层次遍历的思路,只不过是奇偶行时要不要逆序的时候判断一下而已
*/
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
//记录每一层的节点的值
ArrayList<Integer> in= new ArrayList<Integer>();
//将每一层的节点的值添加到二维list中
ArrayList<ArrayList<Integer> > out=new ArrayList<ArrayList<Integer> >();
//保存当前层的节点
Queue<TreeNode> q =new LinkedList<TreeNode>();
//记录下一层的节点
Queue<TreeNode> qin =new LinkedList<TreeNode>();
//利用栈进行逆序
Stack s=new Stack();
if(pRoot==null){
return out;
}
else{
q.add(pRoot);
int step=0;
while(true){
while(!q.isEmpty()){
TreeNode node=q.remove();
if(node.left!=null){
qin.add(node.left);
}
if(node.right!=null){
qin.add(node.right);
}
if(step%2==0){
in.add(node.val);
}
else{
s.push(node.val);
}
}
if(step%2!=0){
while(!s.isEmpty()){
in.add((Integer) s.pop());
}
}
out.add(in);
step++;
s=new Stack();
in=new ArrayList<Integer>();
if(qin.isEmpty()){
break;
}
q=qin;
qin =new LinkedList<TreeNode>();
}
}
return out;
}
}