题目描述
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
得到:
[
[3],
[20, 9],
[15, 7]
]
思路
该题与102相似,唯一的不同是每一层的顺序不同,此时我们可以维持和102一样的遍历逻辑,总是从左往右访问,但是在构建每一层的数组时,根据isLeftToRight来决定是插入到数组的头部还是尾部。
代码
class Solution {public List<List<Integer>> zigzagLevelOrder(TreeNode root) {List<List<Integer>> result = new ArrayList<>();if (root == null ) {return result;}bfs(root, result);return result;}private void bfs(TreeNode root, List<List<Integer>> result) {Deque<TreeNode> queue = new ArrayDeque<>();queue.add(root);boolean isLeftToRight = true;while(!queue.isEmpty()) {int size = queue.size();List<Integer> level = new ArrayList<>();for (int i = 0; i < size; i++) {TreeNode temp = queue.pollFirst();// 与102唯一的不同在这里// isLeftToRight == true,添加到数组末尾// isLeftToRight == false,添加到数组的头部。if (isLeftToRight) {level.add(temp.val);} else {level.add(0, temp.val);}if (temp.left != null) {queue.addLast(temp.left);}if (temp.right != null) {queue.addLast(temp.right);}}result.add(level);isLeftToRight = !isLeftToRight;}}}
PS:
通过isLeftToRight来决定是pollFirst还是pollLast是错误的!!!!因为如果改变了出队顺序,那么其子结点的入队顺序也会被改变!!!
