目录
一、题目
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树:[3,9,20,null,null,15,7]
,3 / \ 9 20 / \ 15 7返回其层次遍历结果:
[ [3], [20,9], [15,7] ]
提示:
节点总数 <= 1000
二、思路
对树逐层遍历、用队列来维护每一层遍历的元素。
1、头节点进入队列
2、队列不为空,获取队列大小 k,(k是就是当前层结点的个数)
3、循环取k个结点,这k个结点为其中一层。进入下一此循环
4、因为奇数层正常打印、偶数层逆序打印,所以需要用个字段对每一行进行标识。
三、代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
if(root==null){
return new ArrayList<>();
}
List<List<Integer>> res = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int sum =1;
while(!queue.isEmpty()){
// 获取队列大小
int k = queue.size();
LinkedList<Integer> temp = new LinkedList<>();
// 循环取出k个结点
for(int i =0;i<k;i++){
TreeNode node =queue.poll();
// 判断是奇数行、正常打印
if(sum%2 ==1){
temp.add(node.val);
}else{
// 偶数行从右到左插入
temp.addFirst(node.val);
}
// 若当前结点存在左右子
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
res.add(temp);
++sum;
}
return res;
}
}
执行结果