题目描述
剑指offer 32-3
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
题目分析
在层次遍历的基础上,对每层的列表level进行处理,如果是奇数层(第一层的索引为1)顺序,偶数层反序;
列表反序的内置函数为:
Collections.reverse(list);
与数组反序的很像:
Arrays.sort(arr);
/**
* 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<>();
List<Integer> level;
int levelCnt = 0;
queue.offer(root);
while(!queue.isEmpty()){
levelCnt++;//层数+1,从第一层开始,奇数层顺序,偶数层倒序
int levelLen = queue.size();
level = new ArrayList<>();//存储每层结果
int i = 0;
while(i < levelLen){
TreeNode headNode = queue.peek();
queue.poll();
i++;
level.add(headNode.val);
if(headNode.left != null){
queue.offer(headNode.left);
}
if(headNode.right != null){
queue.offer(headNode.right);
}
}
if(levelCnt % 2 == 0){//偶数层反序
Collections.reverse(level);
}
if(i == levelLen){
res.add(level);
}
}
return res;
}
}