题目描述
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
得到:
[
[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是错误的!!!!因为如果改变了出队顺序,那么其子结点的入队顺序也会被改变!!!