题目描述
给定一颗二叉树,按照之字形打印出二叉树,即偶数层(从0数)从左到右,奇数层从右到左。
示例:
输入:{1,2,3,#,#,4,5}
输出:[[1],[3,2],[4,5]]
原题链接:按之字形顺序打印二叉树
思路
- 通俗的广度遍历bfs+奇偶判断
- 使用队列
解题
广度遍历解题和递归的深度遍历一样有模版:
- 创建队列,添加根结点到队列
- 循环,出循环的条件是队列为空的时候
- 遍历,也就是每次循环要做的事情,拿到队列的长度,也就是这次遍历的那一层的节点个数,让每一个节点出队,打印这个节点,添加每一个节点的子节点到队列中
硬性基础:
- java队列Queue,实现类是LinkedList
- 进队add()和offer(),区别:出错的时候add方法抛异常,offer返回false
- 出队remove()和poll(),区别:remove出错抛异常,poll返回null
- 枚举队首element()和peek(),区别:element抛异常,peek返回null
- size()返回队列大小
- Collections.reverse()反转list
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
ArrayList<Integer> list=new ArrayList<>();
// 返回结果的容器
if(pRoot==null) return res;
Queue<TreeNode> q=new LinkedList<>();
// 创建队列
q.offer(pRoot);
// 加入根结点
int j=0;
// 记录当前层数是奇数还是偶数,0为偶数层
while(!q.isEmpty()){
// 循环,出循环条件是队列为空,也就是遍历结束了
list.clear();
// 清空记录一层节点的容器
int size=q.size();
// 这里记录大小是防止当前层遍历的时候加入了下一层的节点而打乱当前层的遍历
for(int i=0;i<size;i++){
// 遍历当前层
TreeNode node=q.poll();
// 出队
list.add(node.val);
// 记录出队节点
if(node.left!=null){
q.add(node.left);
}
if(node.right!=null){
q.add(node.right);
}
// 下一层节点入队
}
if(j==1){
Collections.reverse(list);
}
// 奇数层反转
res.add(new ArrayList<>(list));
// 返回结果加入当前层
j=j==0?1:0;
// 三目表达式,奇偶层交换
}
return res;
}