Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
层序遍历二叉树,并按照层数的s型输出每层的值。本题可以使用广度优先遍历,将每层的值保存到数组中,然后使用一个标记值flag,当标记值为true时,本层中的值按照顺序输出,如果标记值为false,本层中的值倒序输出。每输出完一层,就将标记值取反。
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
boolean flag = true;
// dfs(root, res, 0, flag);
bfs(root, res, 0);
return res;
}
private void bfs(TreeNode root, List<List<Integer>> res, int count) {
if(root == null)
return;
boolean flag = true;
Deque<TreeNode> queue = new LinkedList<>();
queue.offerFirst(root);
while(!queue.isEmpty()){
List<TreeNode> nodes = new ArrayList<>();
List<Integer> list = new ArrayList<>();
while (!queue.isEmpty()){
TreeNode node = queue.pollFirst();
nodes.add(node);
list.add(node.val);
}
if(!flag)
Collections.reverse(list);
res.add(list);
flag = !flag;
for (TreeNode node : nodes) {
if(node.left != null)
queue.add(node.left);
if(node.right != null)
queue.add(node.right);
}
nodes.clear();
}
}