题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。


本题是换行打印的升级版(在换行打印版本上进行更改),在换行打印时,将偶数列的添加顺序时进行翻转。如果牺牲一点效率,在翻转时采用头插法即可。
设置一个变量,区别奇数层和偶数层,然后进行不同的处理,在每一层的节点循环后,变量++,因此这个变量可以理解成树的深度。这道题和二叉树求深度紧密联系。

import java.util.Queue;
import java.util.LinkedList;
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer> > arrplus = new ArrayList<ArrayList<Integer> >();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        if(pRoot==null)
            return arrplus;
        queue.offer(pRoot);
        int depth=1;//第一层(同时也是深度)
        while(!queue.isEmpty()){
            int size = queue.size();
            ArrayList<Integer> arr = new ArrayList<Integer>();
            for (int i=0;i<size;i++){
                TreeNode node = queue.poll();
                if(node.left!=null)
                    queue.add(node.left);
                if(node.right!=null)
                    queue.add(node.right);
                if(depth%2==1){//奇数层
                    arr.add(node.val);//在尾部插入,正常的顺序
                }
                if(depth%2==0){//偶数层
                    arr.add(0,node.val);//头插法,效率低
                }
            }
            arrplus.add(arr);
            depth++;
        }
        return arrplus;
    }
}

2.一个优化的版本就是使用栈。利用栈来调整顺序。

import java.util.Queue;
import java.util.LinkedList;
import java.util.Stack;
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer> > arrplus = new ArrayList<ArrayList<Integer> >();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        Stack<Integer> stack = new Stack<>();
        if(pRoot==null)
            return arrplus;
        queue.offer(pRoot);
        int depth=1;//第一层(同时也是深度)
        while(!queue.isEmpty()){
            int size = queue.size();
            ArrayList<Integer> arr = new ArrayList<Integer>();
            for (int i=0;i<size;i++){
                TreeNode node = queue.poll();
                if(node.left!=null)
                    queue.add(node.left);
                if(node.right!=null)
                    queue.add(node.right);
                if(depth%2==1){//奇数层
                    arr.add(node.val);//在尾部插入,正常的顺序
                }
                if(depth%2==0){//偶数层
                    stack.push(node.val);//先放进栈
                }               
            }
            while(stack.size()!=0){ //在一层的都放进栈后,在倒给数组。
                arr.add(stack.pop());
            }
            arrplus.add(arr);
            depth++;
        }
        return arrplus;
    }
}

3.这里其实还可以不使用栈,在添加的时候,换一个添加方式,奇数层,先添加左节点,再添加右节点。偶数层,先添加右节点,再添加左边节点。写起来容易出错。有许多点需要注意。题解中,jav大佬给出的是这种版本。