题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路
设置标志变量flag:奇数层flag=false,偶数层flag=true
用队列存放每一层结点,每遍历完一层,就将flag取反
遍历完一层,利用flag判断是否需要将该层结点反序(偶数层需要反序)
实现
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) {
ArrayList<ArrayList<Integer>> res =new ArrayList<ArrayList<Integer>>();
Queue<TreeNode> q=new LinkedList<>();
if(pRoot==null) return res;
//奇数层flag=false,偶数层flag=true
boolean flag=true;
//先把根加入队列
q.offer(pRoot);
while(!q.isEmpty()){
flag=!flag; //每遍历完一层,就将flag取反(第一次循环,第一层是根,flag为false)
int size=q.size(); //size记录队列大小,即每层结点个数
ArrayList<Integer> list=new ArrayList<>(); //list存放每一层的结点值
//遍历每层结点
for(int i=0;i<size;i++){ //这里的size不可以直接写q.size(),必须使程序再回到外层循环判断,不可只执行内部for循环
TreeNode cur=q.remove();
list.add(cur.val);
if(cur.left!=null){
q.offer(cur.left);
}
if(cur.right!=null){
q.offer(cur.right);
}
}
//遍历完一层后,根据flag判断是奇数层还是偶数层,决定是否需要反转
if(flag){
Collections.reverse(list);
}
res.add(list);
}
return res;
}
}