请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
package jianzhi_offer;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Stack;
import jianzhi_offer.Print.TreeNode;
public class P32_3_Solution {
/*
* 之字形打印二叉树
* 分析可以总结规律:
* 按之字形顺序打印二叉树需要两个栈。
* 如果打印的是奇数层(第一层,第三层),曾先保留左节点再保留有节点到第一个栈中;
* 如果打印的是偶数层(第二层,第四层),先保留右节点再保留左节点到第二个栈中。
* 在打印第一个栈里面的节点时,它的另一个节点保存在另一个栈中。当一层的节点打印完毕时,交换这两个栈并继续打印下一层
*/
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(pRoot == null)
return res;
Stack<TreeNode> s1 = new Stack<>();
Stack<TreeNode> s2 = new Stack<>();
int layer = 1;
s1.add(pRoot);
while(!s1.isEmpty() || !s2.isEmpty()) {
if(layer %2 == 1) {
ArrayList<Integer> list = new ArrayList<>();
while(!s1.isEmpty()) {
TreeNode temp = s1.pop();
list.add(temp.val);
if(temp.left != null) {
s2.add(temp.left);
}
if(temp.right != null) {
s2.add(temp.right);
}
}
if(list != null) {
res.add(list);
layer++;
}
}else {
ArrayList<Integer> list = new ArrayList<>();
while(!s2.isEmpty()) {
TreeNode temp = s2.pop();
list.add(temp.val);
if(temp.right != null) {
s1.add(temp.right);
}
if(temp.left != null) {
s1.add(temp.left);
}
}
if(list != null) {
res.add(list);
layer++;
}
}
}
return res;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}