1. 从上到下打印二叉树 III

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

  1. 例如:
  2. 给定二叉树: [3,9,20,null,null,15,7],
  3. 3
  4. / \
  5. 9 20
  6. / \
  7. 15 7
  8. 返回其层次遍历结果:
  9. [
  10. [3],
  11. [20,9],
  12. [15,7]
  13. ]

思路:

  • 在II的基础上,添加一个验证,如果为true执行从右向左打印,如果为false执行从左向右打印。
  • 从右向左的打印,可以将当前一层的节点全部压入栈中,利用栈的结构特点(先进后出)实现出栈的逆序,进而实现逆向打印。
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        if(root!=null) queue.add(root);
        boolean flag = false;
        while(!queue.isEmpty()){
            List<Integer> temp = new ArrayList<>();
            if(flag){
                Stack<TreeNode> stack = new Stack<>();
                for(int i=queue.size();i>0;i--){
                    TreeNode cur = queue.poll();
                    stack.push(cur);
                    if(cur.left!=null) queue.add(cur.left);
                    if(cur.right!=null) queue.add(cur.right);
                }
                while(!stack.isEmpty()){
                    TreeNode cur = stack.pop();
                    temp.add(cur.val);
                }
                res.add(temp);
                flag = !flag;
            }else{ // 从左到右
                for(int i=queue.size();i>0;i--){
                    TreeNode cur = queue.poll();
                    temp.add(cur.val);
                    if(cur.left!=null) queue.add(cur.left);
                    if(cur.right!=null) queue.add(cur.right);
                }
                res.add(temp);
                flag = !flag;
            }
        }
        return res;
    }
}