题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
示例1
输入
{8,6,10,5,7,9,11}
返回值
[[8],[10,6],[5,7,9,11]]

解题思路
思想:对层序遍历进行改进-利用队列先进先出和栈先进后出的特点
由于下一层需要换顺序,所以应该是上一层后进队的左右子树在该层先进队(这里不同于层序遍历)
步骤如下:
1.根节点入队
2.队非空,取队长度,层数加一
3.节点出队遍历,之后将节点入栈
4.栈非空,节点出栈,根据奇偶层确定左右子树的入队顺序
5.直至便利完成
注意:不能把取队列长度写在循环里,不然循环时长度会更新

Java代码

import java.util.*;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        int count=0;
        ArrayList<ArrayList<Integer>> ans=new ArrayList<>();
        if(pRoot== null) return ans;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(pRoot);//入队
        while(!queue.isEmpty()){
            ArrayList<Integer> list=new ArrayList<>();
            int n=queue.size();//确定本层结点数
            Stack<TreeNode> stack=new Stack<>();
            count++;//记录层数
            for(int i=0;i<n;i++){
                TreeNode node1=queue.poll();//出队
                list.add(node1.val);
                stack.push(node1);//入栈
            }
            while(!stack.empty()){
                TreeNode node=stack.pop();//出栈
                if(count%2==0){//根据奇偶层,确定入队顺序
                    if(node.left != null ) queue.offer(node.left);
                    if(node.right != null ) queue.offer(node.right);
                }
                else{
                    if(node.right != null ) queue.offer(node.right);
                    if(node.left != null ) queue.offer(node.left);
                }
            }
            ans.add(list);
        }
        return ans;
    }
}