https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/description/?envType=study-plan-v2&envId=top-interview-150
相比于单纯的层序遍历这题其实就在采集数据的时候多了一个翻转的步骤,就是在隔一次就会将要采集的层的数据倒着记录下来
class Solution {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if(root == null) return new ArrayList<>();
List<List<Integer>> res = new ArrayList<>();
// 存放当前层的节点,使用Deque可以方便的翻转(就是换个方向出队列)
Queue<TreeNode> currLevel = new LinkedList<>();
currLevel.add(root);
// 存放根节点的数据
res.add(List.of(root.val));
ArrayList<TreeNode> nextLevel = new ArrayList<>();
boolean isReverse = true;
while(!currLevel.isEmpty()) {
while(!currLevel.isEmpty()) {
TreeNode node = currLevel.poll();
if(node.left != null) nextLevel.add(node.left);
if(node.right != null) nextLevel.add(node.right);
}
List<Integer> currLevelVal = new ArrayList<>();
if(isReverse) { // 翻转
for(int i = nextLevel.size() - 1; i >= 0; i--) {
currLevelVal.add(nextLevel.get(i).val);
// currLevel永远保持正常层序遍历的顺序
currLevel.add(nextLevel.get(nextLevel.size() - 1 - i));
}
isReverse = false;
} else {
for(int i = 0; i < nextLevel.size(); i++) {
currLevelVal.add(nextLevel.get(i).val);
currLevel.add(nextLevel.get(i));
}
isReverse = true;
}
if(!nextLevel.isEmpty()) {
res.add(currLevelVal);
// 清空nextLevel
nextLevel.clear();
}
}
return res;
}
}