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]
]
思路很简单,
1.首先是层序遍历,在每一层的结束加一个标记。(queue中加入null节点表示层的结尾)
2.然后加一个奇偶标记来记录当前层的list是否需要逆序
利用Collections.reverse逆序奇数行的list即可
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> lists = new ArrayList<List<Integer>>();
if(root == null) return lists;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
queue.add(null);
int r = 1;//倒转标志
List<Integer> list = new ArrayList<Integer>();
while (!queue.isEmpty()) {
TreeNode now = queue.poll();
if (now == null) {
queue.add(null);
if(r == -1) Collections.reverse(list);
lists.add(list);
r = r * -1;
list = new ArrayList<Integer>();
if (queue.size() == 1) return lists;
} else {
list.add(now.val);
if(now.left != null) queue.add(now.left);
if(now.right != null) queue.add(now.right);
}
}
return lists;
}