题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
 
题目链接:
 
 
分析:
因为只需记录打印顺序,所以只有顺序相反就好。
每行按从左到右的方式记录下一层节点。
 
 
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Iterator;
/*
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) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        if(null == pRoot){
            return list;
        }
        //两个队列,raw主队列
        LinkedList<TreeNode> raw = new LinkedList<TreeNode>();
        raw.add(pRoot);
        boolean flag = true;
        while(raw.size()!=0){
            //记录下当前行的大小
            int  size = raw.size();
            ArrayList<Integer> tmp = new ArrayList<Integer>();
            Iterator<TreeNode> iter = null;
            //flag=true 从左到右打印,false从右到左打印
            if(flag){
                iter = raw.iterator();
            }else{
                iter = raw.descendingIterator();
            }
            //下一次方向相反
            flag = !flag;
            while(iter.hasNext()){
                tmp.add(iter.next().val);
            }
            list.add(tmp);
            //将下一行节点按从左到右记录到raw队列中
            for(int i=0;i<size;i++){
                TreeNode cur = raw.pop();
                if(cur.left != null){
                    raw.add(cur.left);
                }
                if(cur.right != null){
                    raw.add(cur.right);
                }
            }
        }
        return list;
    }

}

 

posted on 2020-06-13 20:29  MoonBeautiful  阅读(185)  评论(0编辑  收藏  举报